Android-operativsystem:Én potentiel sårbarhed pr. 4000 linjer C++-kode

Android-operativsystem:Én potentiel sårbarhed pr. 4000 linjer C++-kode

I mange år har Andrey Karpov udgivet artikler om kodekvalitet og fejlanmeldelser af open source-projekter. For eksempel er han forfatter til sådanne publikationer som "Det ultimative spørgsmål om programmering, refaktorering og alt" og "27 000 fejl i Tizen-operativsystemet".

For nylig er open source Android-operativsystemet blevet interessant for ham. Han undersøgte den del af operativsystemkoden, som er skrevet på sprogene C og C++. Derefter kom han til en konklusion, som altid finder sted efter sådan forskning:menneskelige fejl er altid mulige. Ved at bruge PVS-Studio-værktøjet bliver det muligt at opdage mindst én sikkerhedsdefekt (potentiel sårbarhed) pr. 4000 linjer kode.

Android-koden er af høj kvalitet og er gennemtestet. Men uanset hvor omhyggeligt folk skrev og testede koden, er sandsynligheden for, at fejlen ikke bliver bemærket, meget stor. Statiske og dynamiske kodeanalyseværktøjer kan dække for udviklere. I dette tilfælde blev det statiske analyseværktøj PVS-Studio SAST til applikationssikkerhed brugt til at finde defekter.

Selvfølgelig, uanset hvilke understøttende værktøjer du bruger, er der ingen garanti for, at fejl og sårbarheder ikke forbliver i koden. Deres antal kan dog reduceres dramatisk selv på kodeskrivningsstadiet.

Lad os se eksemplet på en sikkerhedsdefekt fundet i Android-koden.

static void FwdLockGlue_InitializeRoundKeys() {
  unsigned char keyEncryptionKey[KEY_SIZE];
  ....
  memset(keyEncryptionKey, 0, KEY_SIZE); // Zero out key data.
}

Et array keyEncryptionKey oprettes på stakken og gemmer private oplysninger. I slutningen af ​​funktionen ønsker en udvikler at fylde dette array med nuller, så det ikke ved et uheld kommer et sted hen, hvor det ikke burde. Den følgende artikel fortæller om, hvordan informationen kan komme et sted hen, hvor den ikke bør være:"Overskrive hukommelse – hvorfor?".

For at fylde et array, der gemmer private oplysninger med nuller, bruger en udvikler memset fungere. Kommentaren "Nul nøgledata" bekræfter, at vi forstår alt korrekt.

En potentiel sårbarhed ligger i, at compileren med meget stor sandsynlighed vil fjerne funktionskaldet til memset når du bygger udgivelsesversionen. Når bufferen efter et opkald til memset ikke bruges, funktionskaldet til memset er overflødig i forhold til compileren.

Vi har foran os en klassisk sikkerhedsdefekt, klassificeret i henhold til Common Weakness Enumeration som CWE-14:Compiler Removal of Code to Clear Buffers. Jo færre sådanne fejl – jo sværere er det at finde og udnytte sårbarheden i systemet. Med andre ord, jo mindre antallet af CWE-bugs i koden er, jo færre af dem kan blive til CVE under visse omstændigheder.

Hvis du er interesseret i dette emne, foreslår vi at stifte bekendtskab med den fulde tekst af artiklen af ​​Andrey Karpov:We Checked the Android Source Code by PVS-Studio, or Nothing is Perfect

Nyd læsningen!