Image may be NSFW.
Clik here to view.
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”.
Image may be NSFW.
Clik here to view.
4. Skapa kod-integritetspolicys
För att device guard skall fungera, skapar man sk. kodintegritetspolicys. Flödet som jag föreslår är:
-
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
#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.
Image may be NSFW.
Clik here to view.
#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
Image may be NSFW.
Clik here to view.
#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
# 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
The post Device Guard och kodsignering appeared first on Addlevel.