Beveiligingsproblemen in patches voorgesteld door een medewerker van Huawei om de Linux-kernel te beschermen

Ontwikkelaars van het Grsecurity-project trok aandacht voor de aanwezigheid van een triviaal exploiteerbare kwetsbaarheid in de patchset HKSP (Huawei Kernel Self Protection), een paar dagen geleden voorgesteld om de veiligheid van de Linux-kernel te verbeteren. De situatie herinnert eraan geval bij Samsung, waarin een poging om de systeembeveiliging te verbeteren leidde tot de opkomst van een nieuwe kwetsbaarheid en het gemakkelijker maakte om apparaten in gevaar te brengen.

De HKSP-patches zijn gepubliceerd door een Huawei-medewerker, bevatten een vermelding van Huawei in het GitHub-profiel en gebruiken het woord Huawei in de projectnaam (HKSP - Huawei Kernel Self Protection). Tegelijkertijd ontkenden vertegenwoordigers van Huawei het verband tussen het HKSP-project en het bedrijf en verklaarden dat de code op persoonlijk initiatief van de werknemer was ontwikkeld, geen officieel Huawei-project is en niet in de producten van het bedrijf wordt gebruikt. Op GitHub-pagina HKSP met terugwerkende kracht na ontdekking kwetsbaarheden ook was toegevoegd Houd er rekening mee dat het project in mijn vrije tijd wordt ontwikkeld voor onderzoeksdoeleinden.

HKSP omvat veranderingen zoals randomisatie van offsets in de cred-structuur, bescherming tegen aanvallen op de gebruikersidentificatienaamruimte (pid-naamruimte), scheiding van de processtapel van het mmap-gebied, detectie van dubbele oproepen naar de kfree-functie, het blokkeren van lekken via de pseudo -FS /proc (/proc/ {modules, sleutels, key-users}, /proc/sys/kernel/* en /proc/sys/vm/mmap_min_addr, /proc/kallsyms), verbeterde randomisatie van gebruikersruimteadressen, extra Ptrace bescherming, verbeterde smap- en smep-bescherming, de mogelijkheid om het verzenden van gegevens via onbewerkte sockets te verbieden, onjuiste adressen in UDP-sockets te blokkeren en de integriteit van actieve processen te controleren. Het bevat ook de Ksguard-kernelmodule, die gericht is op het detecteren van pogingen om typische rootkits te introduceren.

Patches genaamd Greg Kroah-Hartman, die verantwoordelijk is voor het onderhouden van de stabiele tak van de Linux-kernel, was interessant en vroeg de auteur om de monolithische patch in delen op te delen om de beoordeling en promotie naar de hoofdkernel te vereenvoudigen. Kees Kok, hoofd project op Promotie actieve beschermingstechnologie ook in de Linux-kernel positief reageerde op de patches en vestigde onder de problemen de aandacht op de binding aan de x86-architectuur en het meldingskarakter van veel modi, die alleen informatie over het probleem registreren, maar niet proberen dit te blokkeren.

Een onderzoek naar de patch door Grsecurity-ontwikkelaars bracht veel fouten en zwakke punten in de code aan het licht, en toonde ook de afwezigheid aan van een dreigingsmodel waarmee ze de mogelijkheden van het project adequaat konden beoordelen. Om duidelijk aan te tonen dat de code is geschreven zonder gebruik te maken van veilige programmeermethoden, wordt een voorbeeld gegeven van een triviale kwetsbaarheid in de handler.
bestand /proc/ksguard/state, dat is gemaakt met rechten 0777, wat impliceert dat iedereen schrijftoegang heeft. De functie ksg_state_write, die wordt gebruikt om opdrachten te parseren die naar /proc/ksguard/state zijn geschreven, creëert een tmp[32]-buffer waarnaar gegevens worden geschreven op basis van de grootte van de doorgegeven operand, zonder rekening te houden met de grootte van de doelbuffer en zonder het controleren van de parameter met de tekenreeksgrootte. Die. Om een ​​deel van de kernelstack te overschrijven hoeft een aanvaller alleen maar een speciaal opgemaakte regel naar /proc/ksguard/state te schrijven.

static ssize_t ksg_state_write(struct bestand *file, const char __user *buf,
size_t len, loff_t *offset)
{
u64-waarde;
teken tmp[32];
maat_t n = 0;

if (copy_from_user(tmp, buf, len))
retour -1;

waarde = simple_strtoul(tmp, '\0', 10);
...

Prototype exploiteren:

char buf[4096] = { };
int fd = open(“/proc/ksguard/state”, O_WRONLY);
als (fd >= 0) {
write(fd, buf, groottevan(buf));
sluiten(fd);
}

Bron: opennet.ru

Voeg een reactie