Author: mturk Date: Mon May 25 17:28:48 2009 New Revision: 778458 URL: http://svn.apache.org/viewvc?rev=778458&view=rev Log: Move common security code to wusec.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h?rev=778458&r1=778457&r2=778458&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h Mon May 25 17:28:48 2009 @@ -69,6 +69,9 @@ void ACR_GetUserHomePath(LPWSTR buf, DWORD blen, PSID sid); HANDLE ACR_GetCurrentAccessToken(JNIEnv *_E); PSID ACR_AllocateWellKnownSid(JNIEnv *_E, WELL_KNOWN_SID_TYPE type); +DWORD ACR_SetTokenPrivilege(LPCWSTR szPrivilege, BOOL bEnablePrivilege); +DWORD ACR_EnablePrivilege(LPCWSTR szPrivilege); +PSID ACR_DuplicateSid(JNIEnv *_E, PSID sSID); /** * Heap allocation from main.c Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c?rev=778458&r1=778457&r2=778458&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c Mon May 25 17:28:48 2009 @@ -622,71 +622,22 @@ return JNI_TRUE; } -static BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, - BOOL bEnablePrivilege) -{ - TOKEN_PRIVILEGES tp; - LUID luid; - - if (!LookupPrivilegeValue(NULL, - lpszPrivilege, - &luid)) { - return FALSE; - } - - tp.PrivilegeCount = 1; - tp.Privileges[0].Luid = luid; - if (bEnablePrivilege) - tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - else - tp.Privileges[0].Attributes = 0; - - /* Enable the privilege or disable all privileges. - */ - if (!AdjustTokenPrivileges(hToken, - FALSE, - &tp, - sizeof(TOKEN_PRIVILEGES), - NULL, - NULL)) { - return FALSE; - } - - if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { - /* The token does not have the specified privilege. */ - return FALSE; - } - - return TRUE; -} - - ACR_IO_EXPORT_DECLARE(jboolean, File, fprot2)(ACR_JNISTDARGS, jstring pathname, jobject usr, jobject grp) { int rc = EINVAL; - HANDLE hToken = NULL; UNREFERENCED_O; - if (!OpenProcessToken(GetCurrentProcess(), - TOKEN_ADJUST_PRIVILEGES, - &hToken)) { - rc = ACR_GET_OS_ERROR(); - if (ACR_STATUS_IS_EACCES(rc)) - ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0); - else - ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc); - return JNI_FALSE; - } + /* Enable the SE_TAKE_OWNERSHIP_NAME privilege. */ - if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, TRUE)) { - rc = ACR_GET_OS_ERROR(); + if ((rc = ACR_SetTokenPrivilege(L"SeTakeOwnershipPrivilege", + TRUE)) != ERROR_SUCCESS) { + rc = ACR_FROM_OS_ERROR(rc); if (ACR_STATUS_IS_EACCES(rc)) ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0); else ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc); - CloseHandle(hToken); return JNI_FALSE; } @@ -708,8 +659,7 @@ NULL, NULL); } END_WITH_WSTR(pathname); - SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, FALSE); - CloseHandle(hToken); + ACR_SetTokenPrivilege(L"SeTakeOwnershipPrivilege", FALSE); if (rc) { rc = ACR_FROM_OS_ERROR(rc); if (ACR_STATUS_IS_EACCES(rc)) Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c?rev=778458&r1=778457&r2=778458&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c Mon May 25 17:28:48 2009 @@ -187,89 +187,6 @@ return ERROR_SUCCESS; } -static DWORD set_current_privilege(LPCWSTR szPrivilege, - BOOL bEnablePrivilege) -{ - DWORD dwError; - HANDLE hToken; - TOKEN_PRIVILEGES tp; - LUID luid; - TOKEN_PRIVILEGES tpPrevious; - DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES); - BOOL bSuccess=FALSE; - - if (!LookupPrivilegeValueW(NULL, szPrivilege, &luid)) - return ERROR_NO_SUCH_PRIVILEGE; - - if (!OpenProcessToken(GetCurrentProcess(), - TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, - &hToken)) - return GetLastError(); - - tp.PrivilegeCount = 1; - tp.Privileges[0].Luid = luid; - tp.Privileges[0].Attributes = 0; - - AdjustTokenPrivileges(hToken, - FALSE, - &tp, - sizeof(TOKEN_PRIVILEGES), - &tpPrevious, - &cbPrevious); - - if ((dwError = GetLastError()) == ERROR_SUCCESS) { - tpPrevious.PrivilegeCount = 1; - tpPrevious.Privileges[0].Luid = luid; - - if(bEnablePrivilege) - tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED); - else - tpPrevious.Privileges[0].Attributes &= ~(SE_PRIVILEGE_ENABLED); - - AdjustTokenPrivileges(hToken, - FALSE, - &tpPrevious, - cbPrevious, - NULL, - NULL); - - dwError = GetLastError(); - } - CloseHandle(hToken); - return dwError; -} - -static DWORD enable_privilege(LPCWSTR szPrivilege) -{ - DWORD dwError; - HANDLE hToken; - TOKEN_PRIVILEGES tp; - LUID luid; - - if (!LookupPrivilegeValueW(NULL, szPrivilege, &luid)) - return ERROR_NO_SUCH_PRIVILEGE; - - if (!OpenProcessToken(GetCurrentProcess(), - TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, - &hToken)) - return GetLastError(); - - tp.PrivilegeCount = 1; - tp.Privileges[0].Luid = luid; - tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - - AdjustTokenPrivileges(hToken, - FALSE, - &tp, - sizeof(TOKEN_PRIVILEGES), - NULL, - NULL); - - dwError = GetLastError(); - CloseHandle(hToken); - return dwError; -} - char *acr_log_domain = NULL; extern void do_syslog(jint, LPWSTR, DWORD); @@ -329,7 +246,7 @@ if ((dll_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) { return JNI_ERR; } - if ((rc = enable_privilege(L"SeDebugPrivilege")) != ERROR_SUCCESS) { + if ((rc = ACR_EnablePrivilege(L"SeDebugPrivilege")) != ERROR_SUCCESS) { /* Log that we couldn't set privilege */ acr_init_log_source(LOG_MSG_DOMAIN); do_syslog(ACR_LOG_ERROR, Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c?rev=778458&r1=778457&r2=778458&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c Mon May 25 17:28:48 2009 @@ -205,3 +205,107 @@ } return sid; } + +DWORD ACR_SetTokenPrivilege(LPCWSTR szPrivilege, BOOL bEnablePrivilege) +{ + DWORD dwError = ERROR_SUCCESS; + TOKEN_PRIVILEGES tp; + LUID luid; + HANDLE hToken = NULL; + TOKEN_PRIVILEGES tpPrevious; + DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES); + + if (!LookupPrivilegeValueW(NULL, + szPrivilege, + &luid)) { + return ERROR_NO_SUCH_PRIVILEGE; + } + + if (!OpenProcessToken(GetCurrentProcess(), + TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, + &hToken)) + return GetLastError(); + tp.PrivilegeCount = 1; + tp.Privileges[0].Luid = luid; + tp.Privileges[0].Attributes = 0; + + if (!AdjustTokenPrivileges(hToken, + FALSE, + &tp, + sizeof(TOKEN_PRIVILEGES), + &tpPrevious, + &cbPrevious)) { + dwError = GetLastError(); + } + else { + tpPrevious.PrivilegeCount = 1; + tpPrevious.Privileges[0].Luid = luid; + + if (bEnablePrivilege) + tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED); + else + tpPrevious.Privileges[0].Attributes &= ~(SE_PRIVILEGE_ENABLED); + + AdjustTokenPrivileges(hToken, + FALSE, + &tpPrevious, + cbPrevious, + NULL, + NULL); + /* Always check the last error because it can + * be ERROR_NOT_ALL_ASSIGNED even if TRUE is returned. + */ + dwError = GetLastError(); + } + + CloseHandle(hToken); + return dwError; +} + +DWORD ACR_EnablePrivilege(LPCWSTR szPrivilege) +{ + DWORD dwError; + HANDLE hToken; + TOKEN_PRIVILEGES tp; + LUID luid; + + if (!LookupPrivilegeValueW(NULL, szPrivilege, &luid)) + return ERROR_NO_SUCH_PRIVILEGE; + + if (!OpenProcessToken(GetCurrentProcess(), + TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, + &hToken)) + return GetLastError(); + + tp.PrivilegeCount = 1; + tp.Privileges[0].Luid = luid; + tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + AdjustTokenPrivileges(hToken, + FALSE, + &tp, + sizeof(TOKEN_PRIVILEGES), + NULL, + NULL); + dwError = GetLastError(); + CloseHandle(hToken); + + return dwError; +} + +PSID ACR_DuplicateSid(JNIEnv *_E, PSID sSID) +{ + PSID pSID = NULL; + + if (sSID && IsValidSid(sSID)) { + DWORD dwLen = GetLengthSid(sSID); + pSID = (PSID) ACR_Calloc(_E, THROW_NMARK, dwLen); + if (!pSID) + return NULL; + if (!CopySid(dwLen, pSID, sSID)) { + free(pSID); + pSID = NULL; + } + } + return pSID; +}