[Linux] waterdichte NX/XD bit detectie

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • RiDo78
  • Registratie: Juli 2002
  • Niet online
Beste mede tweakers,

Ik ben bezig met het scripten van een aantal security-checks die regelmatig uitgevoerd moeten worden. Een daarvan is controleren of de kernel gebruik maakt van de Execute Disable of Never Execute functies van de CPU.

Er zijn 1001 websites/fora, inclusief die van Red Hat waar men doodleuk aanraad om een grep als 'protection: active' uit te voeren op de uitvoer van journalctl en/of dmesg of op de messages file. Dat werkt natuurlijk op de meeste machines. . . . . . . . tot de logging geroteerd wordt.

Op mijn CentOS-VM met een uptime van 2 dagen was die melding al uit de journalctl gerold. Ik kon hem nog wel vinden in de messages file en via dmesg. Maar helaas kan ik daar ook niet op vertrouwen aangezien op onze productiesystemen de messages-files maar 3 dagen op het systeem blijven. Bovendien kun je de resultaten van meerdere reboots in die files terug vinden, wat het weer extra complex maakt. Blijft dmesg over... maar ja, eenmaal dmesg --clear uitvoeren en ook die optie is weg.

Dus elke optie die via logging gaat is uitgesloten.

Ook zijn er zat mensen die op internet roepen dat je moet kijken of de NX flag aanwezig is in /proc/cpuinfo. Klinkt mooi aangezien je via /proc rechtstreeks met de kernel communiceert, toch? Maar nee, /proc/cpuinfo is slechts wat de CPU rapporteert. Boot je systeem eens met noexec=off en de NX flag staat daar nog steeds ondanks dat de kernel de NX-functies links laat liggen.

Gezien dit punt bij verschillende hardening-documenten wordt genoemd kan ik mij niet voorstellen dat er geen betere methode is dan de bovenstaande. En ik vraag mij dus af of er een mede-tweaker er in is geslaagd om een waterdichte methode te vinden en hoe die er uit ziet.

Avast bedankt!

Beste antwoord (via RiDo78 op 18-05-2021 13:59)


  • Jorick
  • Registratie: November 2001
  • Laatst online: 21:20
Als je /proc/cpuinfo checkt op de aanwezigheid van de NX-flag en dit combineert met de aanwezigheid van de kernel parameter in /proc/cmdline dan zit je goed toch? NX is ingeschakeld tenzij je het expliciet uitzet via de kernel parameter.

Mocht je er nog steeds niet gerust op zijn dan zou je zelf programmetje kunnen schrijven om te testen of executable space protection functioneert en deze test periodiek uitvoeren. Voor inspiratie zou je bijvoorbeeld hier kunnen kijken.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 10-05 17:57
RiDo78 schreef op vrijdag 14 mei 2021 @ 15:01:
Ook zijn er zat mensen die op internet roepen dat je moet kijken of de NX flag aanwezig is in /proc/cpuinfo. Klinkt mooi aangezien je via /proc rechtstreeks met de kernel communiceert, toch? Maar nee, /proc/cpuinfo is slechts wat de CPU rapporteert. Boot je systeem eens met noexec=off en de NX flag staat daar nog steeds ondanks dat de kernel de NX-functies links laat liggen.
Ja, maar dat zet niemand uit (hoop ik). En je moet wel een hele oude (pre-P4?) machine hebben om er een te treffen die NX niet benut. Als je het echt wilt zien werken, boot eens met noexec=off en controleer eens of de stack executable is.

fgrep [stack] /proc/self/maps


Ik heb het niet getest, maar het lijkt me dat dat zou moeten werken.
Gezien dit punt bij verschillende hardening-documenten wordt genoemd kan ik mij niet voorstellen dat er geen betere methode is dan de bovenstaande. En ik vraag mij dus af of er een mede-tweaker er in is geslaagd om een waterdichte methode te vinden en hoe die er uit ziet.
Het zal nooit waterdicht zijn, want als je applicaties verkeerd gelinkt zijn heb je er alsnog geen profijt van. En er zijn natuurlijk veel meer build time mitigations (PIE, SSP, RELRO, FORTIFY_SOURCE, etc.). Die ontbreken nog veel vaker dan de edge case die je nu aan het najagen bent.

Een handige utility om meer mitigations te controleren gebruikt overigens ook journalctl voor de NX check.

Acties:
  • 0 Henk 'm!

  • RiDo78
  • Registratie: Juli 2002
  • Niet online
Dank je @Thralas, ik heb even op een CentOS 8 VM getest maar helaas zie ik geen verschil. Zowel met als zonder NX-support is de stack niet executable.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Jorick
  • Registratie: November 2001
  • Laatst online: 21:20
Als je /proc/cpuinfo checkt op de aanwezigheid van de NX-flag en dit combineert met de aanwezigheid van de kernel parameter in /proc/cmdline dan zit je goed toch? NX is ingeschakeld tenzij je het expliciet uitzet via de kernel parameter.

Mocht je er nog steeds niet gerust op zijn dan zou je zelf programmetje kunnen schrijven om te testen of executable space protection functioneert en deze test periodiek uitvoeren. Voor inspiratie zou je bijvoorbeeld hier kunnen kijken.

Acties:
  • 0 Henk 'm!

  • RiDo78
  • Registratie: Juli 2002
  • Niet online
Dank je @Jorick, ik vreesde al voor zoiets. Een programmatje schrijven kan, maar dat wordt niet echt mooi om in een ansible script te verwerken. Bovendien wil ik ook niet dat detecties telkens getriggered worden omdat mijn eigen software iets doet wat je niet zomaar zou verwachten.

Ik had echt gehoopt dat ik ergens in /proc ofzo nog iets kon vinden. De methode van @Thralas zou bijvoorbeeld ideaal geweest zijn als dat had gewerkt.

Dus ja, ik zal inderdaad maar voor de combinatie van cpuinfo en cmdline gaan. Het geeft geen 100% garantie, maar komt wel het dichtst in de buurt.

Nogmaals dank beiden voor het meedenken.