lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <8CDCF8B4EC794EE79F2EF85583F659F3@W340>
Date: Tue, 21 Mar 2017 19:09:11 +0100
From: "Stefan Kanthak" <stefan.kanthak@...go.de>
To: <bugtraq@...urityfocus.com>
Cc: <fulldisclosure@...lists.org>
Subject: Defense in depth -- the Microsoft way (part 47): "AppLocker bypasses are not serviced via monthly security roll-ups"

Hi @ll,

Windows 8 and newer versions (Windows 7 and Windows Server 2008 R2
with KB2532445 or KB3125574 installed too) don't allow unprivileged
callers to circumvent AppLocker and SAFER rules via

LoadLibraryEx(TEXT("<arbitrary DLL>"), NULL, LOAD_IGNORE_CODE_AUTHZ_LEVEL);

See <https://msdn.microsoft.com/en-us/library/ms684179.aspx>
and <https://support.microsoft.com/kb/2532445>

| LOAD_IGNORE_CODE_AUTHZ_LEVEL        0x00000010
|
| If this value is used, the system does not check AppLocker rules
| or apply Software Restriction Policies for the DLL. This action
| applies only to the DLL being loaded and not to its dependencies.
| This value is recommended for use in setup programs that must
| run extracted DLLs during installation.
|
| Windows Server 2008 R2 and Windows 7:
| On systems with KB2532445 installed, the caller must be running
| as "LocalSystem" or "TrustedInstaller"; otherwise the system
| ignores this flag.


Unprivileged users can but bypass AppLocker or SAFER alias Software
Restriction Policies via

STARTUPINFO si = {sizeof(STARTUPINFO)};
PROCESS_INFORMATION pi = {0};
CreateProcess(TEXT("<arbitrary exe>"), NULL, NULL, NULL, FALSE,
              CREATE_PRESERVE_CODE_AUTHZ_LEVEL, NULL, NULL, &si, &pi);

on ALL versions from Windows XP to Windows 10!

See <https://msdn.microsoft.com/en-us/library/ms684863.aspx>

| CREATE_PRESERVE_CODE_AUTHZ_LEVEL    0x02000000
|
| Allows the caller to execute a child process that bypasses the
| process restrictions that would normally be applied automatically
| to the process.


Mitigation:
~~~~~~~~~~~

Create an "AppCert.Dll" that exports CreateProcessNotify and
set the following registry entry

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDlls]
"AppCert.Dll"="<path>\AppCert.Dll"
...

Note: AppCertDlls are loaded at the first call of one of the
      CreateProcess*() functions. Process creation is denied
      if one of them returns STATUS_UNSUCCESSFUL from its
      CreateProcessNotify() routine when called with the flag
      PROCESS_CREATION_QUERY.

--- APPCERT.C ---
#pragma comment(linker, "/DLL")
#ifdef _WIN64
#pragma comment(linker, "/EXPORT:CreateProcessNotify,PRIVATE")
#else
#pragma comment(linker, "/EXPORT:CreateProcessNotify=_CreateProcessNotify@8,PRIVATE")
#endif
#pragma comment(linker, "/NOENTRY")

#include <windows.h>

#define PROCESS_CREATION_QUERY   1L
#define PROCESS_CREATION_ALLOWED 2L
#define PROCESS_CREATION_DENIED  3L

NTSTATUS NTAPI CreateProcessNotify(LPCWSTR lpApplicationName, ULONG ulReason)
{
    NTSTATUS ntStatus = STATUS_SUCCESS;

    switch (ulReason)
    {
    case PROCESS_CREATION_QUERY:
        // called once for each process that is to be created
        // return STATUS_SUCCESS to allow process creation or
        // return STATUS_UNSUCCESSFUL to deny process creation

        if (forbidden(lpApplicationName))
            ntStatus = STATUS_UNSUCCESSFUL;

        break;

    case PROCESS_CREATION_ALLOWED:
        // called once for each process that is allowed creation

        ...

        break;

    case PROCESS_CREATION_DENIED:
        // called once for each process that is denied creation

        ...

        break;

    default:
        ;
    }

    // the return value is only used for PROCESS_CREATION_QUERY,
    // all other conditions are ignored

    return ntStatus;
}
--- EOF ---


stay tuned
Stefan Kanthak


Timeline:
~~~~~~~~~

2017-03-10    sent vulnerability report to vendor

2017-03-10    reply from vendor: MSRC case 37727 opened

2017-03-13    reply from vendor: product team is working on case

2017-03-21    reply from vendor:
              "The product team has finished their investigation and
               determined this will be serviced in a future version
               of Windows. AppLocker bypasses are not serviced via
               monthly security roll-ups; only major version updates."

2017-03-21    <https://support.microsoft.com/kb/2532445> but serviced
              a bypass with a hotfix which was incorporated in later
              security updates and is included in the "convenience"
              rollup <https://support.microsoft.com/en-us/kb/3125574>

2017-03-21    reply from vendor:
              "If you want this fixed immediately and are an
               enterprise customer you'll need to work with your
               Account Manager to open a support case."

2017-03-21    report published

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ