Ignore:
Timestamp:
Jan 9, 2017, 11:09:38 AM (3 years ago)
Author:
jrpelegrina
Message:

Update new version: 3.15.02

File:
1 edited

Legend:

Unmodified
Added
Removed
  • filezilla/trunk/fuentes/src/putty/windows/winsecur.c

    r130 r3185  
    1212#define WINSECUR_GLOBAL
    1313#include "winsecur.h"
     14
     15/* Initialised once, then kept around to reuse forever */
     16static PSID worldsid, networksid, usersid;
     17
    1418
    1519int got_advapi(void)
     
    2428        successful = advapi &&
    2529            GET_WINDOWS_FUNCTION(advapi, GetSecurityInfo) &&
     30            GET_WINDOWS_FUNCTION(advapi, SetSecurityInfo) &&
    2631            GET_WINDOWS_FUNCTION(advapi, OpenProcessToken) &&
    2732            GET_WINDOWS_FUNCTION(advapi, GetTokenInformation) &&
     
    2934            GET_WINDOWS_FUNCTION(advapi, SetSecurityDescriptorOwner) &&
    3035            GET_WINDOWS_FUNCTION(advapi, SetEntriesInAclA);
    31     }
    32     return successful;
    33 }
    34 
    35 int got_crypt(void)
    36 {
    37     static int attempted = FALSE;
    38     static int successful;
    39     static HMODULE crypt;
    40 
    41     if (!attempted) {
    42         attempted = TRUE;
    43         crypt = load_system32_dll("crypt32.dll");
    44         successful = crypt &&
    45             GET_WINDOWS_FUNCTION(crypt, CryptProtectMemory);
    4636    }
    4737    return successful;
     
    10090}
    10191
     92int getsids(char *error)
     93{
     94    SID_IDENTIFIER_AUTHORITY world_auth = SECURITY_WORLD_SID_AUTHORITY;
     95    SID_IDENTIFIER_AUTHORITY nt_auth = SECURITY_NT_AUTHORITY;
     96    int ret;
     97
     98    error=NULL;
     99
     100    if (!usersid) {
     101        if ((usersid = get_user_sid()) == NULL) {
     102            error = dupprintf("unable to construct SID for current user: %s",
     103                               win_strerror(GetLastError()));
     104            goto cleanup;
     105        }
     106    }
     107
     108    if (!worldsid) {
     109        if (!AllocateAndInitializeSid(&world_auth, 1, SECURITY_WORLD_RID,
     110                                      0, 0, 0, 0, 0, 0, 0, &worldsid)) {
     111            error = dupprintf("unable to construct SID for world: %s",
     112                               win_strerror(GetLastError()));
     113            goto cleanup;
     114        }
     115    }
     116
     117    if (!networksid) {
     118        if (!AllocateAndInitializeSid(&nt_auth, 1, SECURITY_NETWORK_RID,
     119                                      0, 0, 0, 0, 0, 0, 0, &networksid)) {
     120            error = dupprintf("unable to construct SID for "
     121                               "local same-user access only: %s",
     122                               win_strerror(GetLastError()));
     123            goto cleanup;
     124        }
     125    }
     126
     127    ret=TRUE;
     128
     129 cleanup:
     130    if (ret) {
     131      sfree(error);
     132      error = NULL;
     133    }
     134    return ret;
     135}
     136 
     137
    102138int make_private_security_descriptor(DWORD permissions,
    103139                                     PSECURITY_DESCRIPTOR *psd,
     
    111147    int ret = FALSE;
    112148
    113     /* Initialised once, then kept around to reuse forever */
    114     static PSID worldsid, networksid, usersid;
    115149
    116150    *psd = NULL;
     
    118152    *error = NULL;
    119153
    120     if (!got_advapi()) {
    121         *error = dupprintf("unable to load advapi32.dll");
    122         goto cleanup;
    123     }
    124 
    125     if (!usersid) {
    126         if ((usersid = get_user_sid()) == NULL) {
    127             *error = dupprintf("unable to construct SID for current user: %s",
    128                                win_strerror(GetLastError()));
    129             goto cleanup;
    130         }
    131     }
    132 
    133     if (!worldsid) {
    134         if (!AllocateAndInitializeSid(&world_auth, 1, SECURITY_WORLD_RID,
    135                                       0, 0, 0, 0, 0, 0, 0, &worldsid)) {
    136             *error = dupprintf("unable to construct SID for world: %s",
    137                                win_strerror(GetLastError()));
    138             goto cleanup;
    139         }
    140     }
    141 
    142     if (!networksid) {
    143         if (!AllocateAndInitializeSid(&nt_auth, 1, SECURITY_NETWORK_RID,
    144                                       0, 0, 0, 0, 0, 0, 0, &networksid)) {
    145             *error = dupprintf("unable to construct SID for "
    146                                "local same-user access only: %s",
    147                                win_strerror(GetLastError()));
    148             goto cleanup;
    149         }
    150     }
     154    if (!getsids(*error))
     155      goto cleanup;
    151156
    152157    memset(ea, 0, sizeof(ea));
     
    219224}
    220225
     226int setprocessacl(char *error)
     227{
     228    SID_IDENTIFIER_AUTHORITY world_auth = SECURITY_WORLD_SID_AUTHORITY;
     229    SID_IDENTIFIER_AUTHORITY nt_auth = SECURITY_NT_AUTHORITY;
     230    EXPLICIT_ACCESS ea[2];
     231    int acl_err;
     232    int ret=FALSE;
     233    PACL acl = NULL;
     234
     235    static const nastyace=WRITE_DAC | WRITE_OWNER |
     236        PROCESS_CREATE_PROCESS | PROCESS_CREATE_THREAD |
     237        PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION |
     238        PROCESS_SET_QUOTA | PROCESS_SET_INFORMATION |
     239        PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE |
     240        PROCESS_SUSPEND_RESUME;
     241
     242    if (!getsids(error))
     243        goto cleanup;
     244
     245    memset(ea, 0, sizeof(ea));
     246
     247    /* Everyone: deny */
     248    ea[0].grfAccessPermissions = nastyace;
     249    ea[0].grfAccessMode = DENY_ACCESS;
     250    ea[0].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
     251    ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
     252    ea[0].Trustee.ptstrName = (LPTSTR)worldsid;
     253
     254    /* User: user ace */
     255    ea[1].grfAccessPermissions = ~nastyace & 0x1fff;
     256    ea[1].grfAccessMode = GRANT_ACCESS;
     257    ea[1].grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
     258    ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
     259    ea[1].Trustee.ptstrName = (LPTSTR)usersid;
     260
     261    acl_err = p_SetEntriesInAclA(2, ea, NULL, &acl);
     262
     263    if (acl_err != ERROR_SUCCESS || acl == NULL) {
     264        error = dupprintf("unable to construct ACL: %s",
     265                          win_strerror(acl_err));
     266        goto cleanup;
     267    }
     268
     269    if (ERROR_SUCCESS != p_SetSecurityInfo
     270        (GetCurrentProcess(), SE_KERNEL_OBJECT,
     271         OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
     272         usersid, NULL, acl, NULL)) {
     273        error=dupprintf("Unable to set process ACL: %s",
     274                        win_strerror(GetLastError()));
     275        goto cleanup;
     276    }
     277                     
     278
     279    ret=TRUE;
     280   
     281  cleanup:
     282    if (!ret) {
     283        if (acl) {
     284            LocalFree(acl);
     285            acl = NULL;
     286        }
     287    }
     288    return ret;
     289
    221290#endif /* !defined NO_SECURITY */
Note: See TracChangeset for help on using the changeset viewer.