Device Guard och kodsignering

Deviceguard0
De senaste säkerhetsrapporterna talar ett tydligt språk – signaturbaserade antivirus har spelat ut sin roll, det är för enkelt att ta sig förbi dessa. 70% till 90% av skadlig kod är unik för en specifik organisation ur ett signatur/hash-perspektiv. Samtidigt rapporterar Microsoft att 96% av all skadlig kod man identifierar är osignerad, och det är här det blir riktigt intressant.

Device guard är en ny funktion i Windows 10 som ger kontroll över vad som får köras på datorn – oberoende av om det är en administratör eller inte som försöker köra programmet. Detta görs genom att kräva att de binärer som körs är kodsignerade av en betrodd utfärdare. Konceptet är snarlikt det man ser på mobilsidan idag, där endast godkända signerade applikationer från en store får installeras och köras. Med andra ord innebär det att ett företag som implementerar Device Guard blockerar 96% av all känd skadlig kod för Windows-plattformen.

Jag bestämde mig för att implementera device guard på min egen Surface Pro 3, och delger mina findings här. Jag visar på registerinställningarna som behöver göras för konfigurationen, vilket förenklar vid skriptade installationer som t.ex. vid olika automatiserade konfigurationer eller via Configuration Manager, men dessa kan också göras via GPO:er.

1. Operativsystem
Device Guard kräver Windows 10 Enterprise.

2. Hårdvara
Device guard använder den nya funktionen Virtualization Based Security, där kod-integritetstjänsten för Device Guard körs bredvid/isoleras från kerneln i en container skyddad av Windows Hypervisor. Detta innebär att även om kerneln blir drabbad av malware fortsätter Device Guard fungera.
För att Virtualization based security skall fungera, krävs att hårdvaran stödjer Intel VT-x eller AMD-V och Second Level Address Translation.

3. Aktivera features och virtualization based security
Aktivera Hyper-V feature:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All
På min Surface var jag också tvungen att köra följande:
bcdedit /set hypervisorlaunchtype auto
Aktivera Isolated User Mode feature:
Enable-WindowsOptionalFeature -Online -FeatureName "IsolatedUserMode" -All

Slå på virtualization based security:
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "EnableVirtualizationBasedSecurity" /t REG_DWORD /d 1 /f

Aktivera secure boot med DMA:
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "RequirePlatformSecurityFeatures" /t REG_DWORD /d 2 /f

Aktivera Hypervisor-Enforced Code Integrity:
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v "HypervisorEnforcedCodeIntegrity" /t REG_DWORD /d 1 /f

Starta om datorn. Man kan verifiera att Device Guard är aktiverat genom att köra msinfo32 och leta efter raden: “Device Guard Security Services Running”.
Deviceguard1

4. Skapa kod-integritetspolicys
För att device guard skall fungera, skapar man sk. kodintegritetspolicys. Flödet som jag föreslår är:

  • Identifiera en dator som kommer vara referensdator, och dedikera den för att skapa kodintegritetspolicy och senare katalogfiler (vi kommer till katalogfiler längre ned).
  • Installera samtliga program som skall köras i företaget på denna. Man kan såklart ha dedikerade datorer för olika roller som t.ex. ekonomidator, IT-administratörer osv. för att skapa olika kodintegritetspolicys.
  • Det finns inget GUI för att skapa integritetspolicys, det är powershell som gäller. Säkerställ att det finns någon binär installerad på datorn som signerats med ett kodsigneringscertifikat utfärdat av den interna organisationens PKI. Detta gör att detta certifikat kommer med i kodintegritetspolicyn. Om det inte finns någon signerad binär (eller skript), kan man enkelt fixa detta:
    1. Ladda ned och installera Windows 10 SDK för att kunna köra signtool.exe (på en annan dator än referensmaskinen) från https://dev.windows.com/en-us/downloads/windows-10-sdk
      Signtool ligger i katalogen: C:\Program Files (x86)\Windows Kits\10\bin\x64\
      Skapa ett enkelt powershellskript.
      Signera detta med ett internt kodsigneringscertifikat:
      Verifiera att kodsigneringscertifikatet har importerats till din certificate eller finns på filsystemet.
      Öppna signtool.exe och signera katalogfilen baserad på vart certifikatet finns lagrat.
      Om man använder en PFX-fil i filsystemet kan man använda exemplet nedan:

    signtool sign /f "C:\temp\CodeSigning.pfx" /P "PutPasswordHere" /fd sha256 /v "C:\Users\ditt_user_name\Desktop\skript.ps1"

      Om man har importerat certifikatet i sin cert store:

    signtool sign /n <\\CertSubjectName> /fd sha256 /v

  • Först inventerar man alla binärer som finns på datorn med CMD:let New-CIPolicy och skapar en policy för vilka certifikat man skall lita på för kodsignering. I skriptet nedan används shadow copy då fillåsningar annars kommer generera fel. Obs – man kan sätta olika hårda krav med –level, här används certifikat, men filnamn finns t.ex. som val.

    #Create a ShadowCopy to avoid locks
    $s1 = (gwmi -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")
    $s2 = gwmi Win32_ShadowCopy | ? { $_.ID -eq $s1.ShadowID }
    $d = $s2.DeviceObject + "\"
    cmd /c mklink /d C:\scpy "$d"
    #Create policy from current system
    New-CIPolicy -l PcaCertificate -f C:\DeviceGuardPolicy.xml –s C:\scpy –u
    #Remove ShadowCopy
    "vssadmin delete shadows /Shadow=""$($s2.ID.ToLower())"" /Quiet" | iex

    Detta skapar en xml-fil med de utfärdare man litar på, se nedan. Per default sätts policyn till audit mode, vilket innebär att device guard endast loggar istället för att hindra osignerade binärer att köra.

  • Deviceguard2

  • Konvertera xml-filen till binärformat med ConvertFrom-CIPolicy CMD:let och kopiera till rätt katalog för att aktivera Device Guard. Starta om datorn.

    #Compile policy as binary
    ConvertFrom-CIPolicy C:\DeviceGuardPolicy.xml C:\DeviceGuardPolicy.bin
    #Install compiled policy
    cp C:\DeviceGuardPolicy.bin c:\Windows\System32\CodeIntegrity\SIPolicy.p7b
    #Policy takes effect after reboot

  • Starta alla program på datorn – detta är ett nödändigt steg för att skapa upp tillräckligt med loggdata för att komplettera policyn med. Var noggrann här för att säkerställa att alla binärer som inte är signerade kommer med i policyn. Eventloggen för Device Guard heter Code Integrity.
  • Deviceguard3

  • Nästa steg är att generera en ny kodintegritetsfil baserat på logghändelser, för att sedan slå ihop med den som skapats tidigare med CMD:let Merge-CIPolicy. Jag lade in en kommentar i skriptet nedan om att man kan behöva köra shadow copies även här för att undvika fillåsningar. I skriptet nedan används parametern –fallback hash för att kalkylera hash-värden på de binärer som inte är signerade. CMD:let Set-RuleOption –option 3 innebär att policyn sätts i audit mode, bara för att vi skall kunna fortsätta testa och säkerställa att vi inte får fler fel. Starta om datorn efter detta och verifiera i loggen att allt verkar ok.

    #Create policy from audit log events
    #By specifying the –UserPEs parameter, the rule option "0 Enabled:UMCI" is automatically added to the code integrity policy
    #The rule option "0 Enabled:UMCI" Code integrity policy restrict both kernel-mode and user-mode binaries. By default, only kernel-mode binaries are restricted. Enabling this rule option validates user mode executables and scripts.
    #The command below might cause invalid handle exception due to locked file - in such case, create a shadow copy, and use the scanpath parameter, like below:
    ##$s1 = (gwmi -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")
    ##$s2 = gwmi Win32_ShadowCopy | ? { $_.ID -eq $s1.ShadowID }
    ##$d = $s2.DeviceObject + "\"
    ##cmd /c mklink /d C:\scpy "$d"
    ##New-CIPolicy -Level PcaCertificate -f C:\Audit.xml -Audit -UserPEs -Fallback Hash -Verbose -Debug -ScanPath C:\scpy
    New-CIPolicy -Level PcaCertificate -f C:\AuditPolicy.xml -Audit -UserPEs -Fallback Hash
    #Merge audit policy with other policy/policies
    Merge-CIPolicy –OutputFilePath C:\MergedPolicy.xml –PolicyPaths C:\AuditPolicy.xml,C:\DeviceGuardPolicy.xml
    #Set policy options e.g. Audit Mode (option 3)
    Set-RuleOption –option 3 –FilePath C:\MergedPolicy.xml
    #Compile policy as binary
    ConvertFrom-CIPolicy C:\MergedPolicy.xml C:\MergedPolicy.bin
    #Install compiled policy
    cp C:\MergedPolicy.bin c:\Windows\System32\CodeIntegrity\SIPolicy.p7b
    #Policy takes effect after reboot

  • Sätt Device Guard i enforced-läge genom att ange – delete i set-RuleOption. Efter att skriptet körs, är det bara att starta om datorn.
    # Check for missing apps, libraries and drivers if none, enforce
    Set-RuleOption –option 3 –FilePath C:\MergedPolicy.xml -Delete
    ConvertFrom-CIPolicy C:\MergedPolicy.xml C:\MergedPolicy.bin
    Move-Item C:\MergedPolicy.bin c:\Windows\System32\CodeIntegrity\SIPolicy.p7b -Force
    # reboot
  • 5. Skapa katalogfiler
    Kodsignering är en förutsättning för Device Guard, men för de line of business-applikationer som vi inte kan signera finns en workaround genom att använda signerade katalogfiler. En sådan skapar man med packageinspector.
    I exemplet nedan skapar jag en katalogfil för 7-zip. För att processen skall fungera bra är det viktigt att man först startar package inspector, sedan kopierar över installationsfiler till datorn för att sedan dra igång installationen.

      Starta package inspector
      #Runthis part first, change the app name to something appropriate
      PackageInspector.exe Start C:
      $App="7zip-9.20"
      $Customer="Addlevel"
      $Path=$env:userprofile+"\Desktop"
      $CatFileName=$Path + "\" + $App + "-" + $Customer + ".cat"
      $CatDefName=$Path + "\" + $App + "-" + $Customer + ".cdf"
      Kopiera över installationsfiler till datorn där package inspector kör och starta installationen. När den är klar, starta programmet, säkerställ att det uppdaterar sig mot Internet om det behöver. Stäng ned programmet efter uppdatering och starta och stäng ned igen.
      Stoppa package inspector.
      #Download the installation program inte the folder where the installation files will be placed
      #Install the application, start it, run any updates and stop it. Start it and stop it again.
      #Run the last line of the script below.
      PackageInspector.exe Stop C: -Name $CatFileName -cdfpath $CatDefName
      För att katalogfilen skall vara valid, behöver den signeras med signtool. Här använder jag Verisigns timestamp server för signeringen.
      C:\Program Files (x86)\Windows Kits\10\bin\x64>signtool.exe sign /f "C:\temp\CodeSigning.pfx" /t http://timestamp.verisign.com/scripts/timstamp.dll /P "Enter_pfx_password_here" /fd sha256 /v "path-of-catalogfile.cat"
      I File Explorer, högerklicka på katalogfilen, välj Properties, and och klicka sedan på Digital Signatures tabben för att säkerställa att katalogfilens digitala signatur är korrekt.
      Den signerade katalogfilen skall sedan vid installation av mjukvaran på målsystem som kör Device Guard placeras i C:\Windows\System32\catroot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}. Då kommer installationsprogrammet kunna köras, och även själva programmet.

    Avslutningsvis – jag är inne på tredje veckan med Device Guard och är som sagt glatt överraskad. Det är däremot uppenbart att när man kräver signerade binärer och börjar jobba med katalogfiler behöver skapandet av dessa automatiseras som en naturlig del i applikationspaketeringen, t.ex. vid uppgraderingar av applikationer. Man behöver också säkerställa att man som en naturlig del i buildprocessen för sina internutvecklade applikationer signerar sin kod. Men lyckas man med det, har man implementerat ett mycket starkt skydd mot skadlig kod, vilket är väl värt investeringen i mina ögon.

    För er som önskar fördjupa er än mer i ämnet kommer här lite länkar:

    Dropping the Hammer Down on Malware Threats with Windows 10’s Device Guard
    https://channel9.msdn.com/Events/Ignite/2015/BRK2336

    Device Guard deployment guide
    https://technet.microsoft.com/en-us/library/mt463091(v=vs.85).aspx

    Konfigurera Device Guard med Configuration Manager
    http://blogs.technet.com/b/configmgrteam/archive/2015/10/30/managing-windows-10-device-guard-with-configuration-manager.aspx

    Använda Signtool:
    https://msdn.microsoft.com/en-us/library/windows/desktop/aa388170(v=vs.85).aspx

    Med vänliga hälsningar,
    Mårten Thomasson

    Mårten Thomasson
    CEO at AddLevel and Cyber Security Advisor with engagements ranging from security design and architecture to implementation of strategic security frameworks. marten.thomasson@addlevel.se