Skip to content

Commit

Permalink
pythongh-114096: Restore privileges in _winapi.CreateJunction after c…
Browse files Browse the repository at this point in the history
…reating the junction (pythonGH-114089)

This avoids impact on later parts of the application which may be able to do things they otherwise shouldn't.
  • Loading branch information
zooba committed Jan 16, 2024
1 parent e5ae15f commit 19d9f90
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Process privileges that are activated for creating directory junctions are
now restored afterwards, avoiding behaviour changes in other parts of the
program.
34 changes: 25 additions & 9 deletions Modules/_winapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,12 @@ _winapi_CreateJunction_impl(PyObject *module, LPCWSTR src_path,
{
/* Privilege adjustment */
HANDLE token = NULL;
TOKEN_PRIVILEGES tp;
struct {
TOKEN_PRIVILEGES base;
/* overallocate by a few array elements */
LUID_AND_ATTRIBUTES privs[4];
} tp, previousTp;
int previousTpSize = 0;

/* Reparse data buffer */
const USHORT prefix_len = 4;
Expand All @@ -566,17 +571,21 @@ _winapi_CreateJunction_impl(PyObject *module, LPCWSTR src_path,

/* Adjust privileges to allow rewriting directory entry as a
junction point. */
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) {
goto cleanup;
}

if (!LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &tp.Privileges[0].Luid))
if (!LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &tp.base.Privileges[0].Luid)) {
goto cleanup;
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
NULL, NULL))
tp.base.PrivilegeCount = 1;
tp.base.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(token, FALSE, &tp.base, sizeof(previousTp),
&previousTp.base, &previousTpSize)) {
goto cleanup;
}

if (GetFileAttributesW(src_path) == INVALID_FILE_ATTRIBUTES)
goto cleanup;
Expand Down Expand Up @@ -657,8 +666,15 @@ _winapi_CreateJunction_impl(PyObject *module, LPCWSTR src_path,
cleanup:
ret = GetLastError();

CloseHandle(token);
CloseHandle(junction);
if (previousTpSize) {
AdjustTokenPrivileges(token, FALSE, &previousTp.base, previousTpSize,
NULL, NULL);
}

if (token != NULL)
CloseHandle(token);
if (junction != NULL)
CloseHandle(junction);
PyMem_RawFree(rdb);

if (ret != 0)
Expand Down

0 comments on commit 19d9f90

Please sign in to comment.