我正在开发一个在 Windows 上运行的 Fortran 应用程序。我们使用 Win32 API 来实现很多功能。特别是,我们大量使用
CreateThread
在后台启动计算量大的子例程,以便用户可以同时与 GUI 进行交互。调用看起来像这样:
my_thread = CreateThread(NULL_SECURITY_ATTRIBUTES,0,LOC(my_subroutine),NULL,0,NULL)
最近,一些用户报告说,每当我们的应用程序运行时,Windows 安全都会向他们发出警告。特别是,它告诉他们“application.exe 远程更改了线程上下文以将代码注入到 application.exe 中”。我不明白为什么会抛出这个警告。
我们使用这些线程类型 API 函数的其他地方是对
CloseHandle
或 WaitForSingleObject
的调用。我们还有这样的代码:
TYPE (T_STARTUPINFO) :: sival
TYPE (T_PROCESS_INFORMATION) :: pival
call ZeroMemory(LOC(pival),SIZEOF(pival))
call ZeroMemory(LOC(sival),SIZEOF(sival))
sival%cb = SIZEOF(sival)
sival%dwFlags = STARTIF_USESHOWWINDOW
sival%wShowWindow = SW_SHOWNORMAL
iret = CreateProcess(path_to_executable,NULL,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,sival,pival)
iret = WaitForSingleObject(pival%hProcess,INFINITE)
我们从未使用过
SuspendThread
、WriteProcessMemory
或 SetThreadContext
等函数。
我们如何导致此安全警告以及如何修复它?这是我们在
NULL_SECURITY_ATTRIBUTES
通话中使用 CreateThread
的问题吗?
我对简单地绕过或抑制警告不感兴趣。我想确保我正在创建一个用户可以信任的安全应用程序。
您在 Fortran 应用程序中遇到的安全警告可能是由于您使用
CreateThread
函数创建线程以及使用 NULL_SECURITY_ATTRIBUTES
的方式造成的。以下是该问题的详细信息以及解决方法:
警告原因:
NULL_SECURITY_ATTRIBUTES
与 CreateThread
一起使用时,Windows 会分配一个默认安全描述符,该描述符允许对新创建的线程进行完全访问(读、写和执行)。解决警告:
这里有两种解决此问题的方法:
指定安全属性:
不要使用
NULL_SECURITY_ATTRIBUTES
,而是创建一个自定义安全描述符,仅授予线程必要的权限。这涉及使用 SECURITY_ATTRIBUTES
结构并设置 lpSecurityDescriptor
字段。
这是一个例子:
TYPE (SECURITY_ATTRIBUTES), POINTER :: sa
ALLOCATE(sa)
! Set up security descriptor with limited access
InitializeSecurityAttributes(sa)
! ... (Configure security descriptor)
my_thread = CreateThread(sa, 0, LOC(my_subroutine), NULL, 0, NULL)
DEALLOCATE(sa)
重要提示:确保安全描述符仅授予线程有效运行所需的最低权限。您可能需要查阅 Windows 安全文档以获取特定权限。
考虑线程池:
如果您的应用程序频繁创建和销毁线程,请考虑使用线程池。线程池管理具有定义的安全属性的预先创建的线程池。这种方法减少了每次创建新线程的开销,并避免了单独管理每个线程的安全属性的需要。
其他注意事项:
CreateProcess
的使用情况。虽然您提供的代码片段似乎是标准的,但请确保您在流程创建过程中没有使用任何意外的标志或权限。CreateThread
和安全属性的 Microsoft 文档以更深入地了解:https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread