Vilkårlig kodeudførelse

Vilkårlig kodeudførelse  er en fejl i et softwaresystem, når en ondsindet bruger ( hacker ) kan tvinge den til at udføre en hvilken som helst maskinkode, de ønsker. Hvis en maskine kan fås til at udføre vilkårlig kode over et netværk, kaldes dette nogle gange fjernudførelse af kode . Dette er den farligste softwaresårbarhed - ondsindet kode introduceres gennem tilsyneladende harmløse handlinger (for eksempel download af en datafil), og kan gøre alt inden for programmets privilegier: udtrække information fra programmets hukommelse, sende det over netværket, læse , skriv og rediger filer ...

En lignende sårbarhed for nettet kaldes cross-site scripting  - men da JavaScript i sig selv er begrænset i sine muligheder, så er skaden fra det normalt mindre, primært datalæk. En lignende sårbarhed for SQL kaldes SQL-injektion , og den er fyldt med alt, hvad SQL kan gøre - lækager, substitutioner og tab af data.

Årsager

De vigtigste årsager til at udføre vilkårlig kode er:

Hukommelseskorruption Eksempel: bufferoverløb overskriver returmarkøren (i x86 vokser stakken ned, og markøren er efter stakrammen ). Så snart programmet skal afslutte subrutinen, henter processoren denne adresse fra stakken og hopper dertil - til hackersubrutinen. Automatisk serialisering + over-tillid Ofte er der i et program eller systembiblioteker sårbare klasser, der udfører kode ved en fejltagelse, eller system, der virkelig er i stand til at udføre hvad som helst. På nogle sprog ( Java ) er det sædvanligt at sende komplekse objektstrukturer gennem standard serialisering - og hvis en angriber sender en kommando for at oprette et sådant objekt, vil det være muligt at udføre vilkårlig kode. WebSphere og Jenkins [1] havde en lignende sårbarhed . Tilfældig kodeudførelse i operationer på EXE og DLL, der ikke indebærer denne udførelse To eksempler: 1. I Windows indlæses et ikon fra en DLL gennem en funktion LoadLibrary, der blandt andet udfører DLL-initialiseringskoden - således er det nok at gennemse mappen med den "forgiftede" DLL i Stifinder for at udføre den ondsindet kode. Løst via et ekstra flag LOAD_LIBRARY_AS_DATAFILE, ikke eksekverende kode. 2. I Unix-lignende operativsystemer er programmet ldd, der kontrollerer programmets afhængigheder, et simpelt script, der udfører en ELF-fil med bestemte systemindstillinger [2] . Ikke løst - bare lad være med at køre ldd på uverificerede filer.

Forsvar

Forbud mod ændring af kodesegmenter og udførelse af datasegmenter I dette tilfælde vil programmet simpelthen ikke være i stand til at skrive noget til hukommelsen, der kan udføres. En ekstrem mulighed er Harvard-arkitekturen , almindelig i begrænsede maskiner, hvor kode og data er placeret i forskellige adresserum. Ulempe: selvmodificerende kode findes , native loaders (eksekverbar filkomprimering, kopibeskyttelse...), JIT-kompilering . Køre programmer med rettigheder, der ikke vil tillade meget skade Da det er ret ubelejligt at arbejde på en begrænset konto, implementerede Microsoft Brugerkontokontrol , som forhindrer programmer i at arbejde med systemdata. I browsere, som de programmer, der påtager sig de mest massive hackerangreb, er der arbejdet med faner i begrænsede processer - dette blev først implementeret i Google Chrome og senere i Firefox Quantum. Ulempe: kompleksiteten af ​​rettighedsdistributionssystemet; under alle omstændigheder vil der være programmer med brede rettigheder, og de vil blive hovedmålet for hackere. Program Address Space Randomization ( ASLR ) Ikke-vedvarende adresser gør det sværere at opbygge en live-udnyttelse. Ulemper: langsom indlæsning. Udvidet selvtjek i biblioteker De bruges i kritisk software, der er særligt udsat for hackerangreb (f.eks. i netværkssoftware). I Java -runtime-systemet kontrolleres f.eks. altid adgang til et array eller objekt, hvilket gør hukommelseskorruption vanskelig. Ulempe: nedsat ydeevne. Kode stil restriktioner Således er den stive MISRA C -kodestandard, der er vedtaget i bilindustrien, designet til at reducere risikoen for fejl. Brug af begrænsede virtuelle maskiner og scriptsprog i stedet for maskinkode Hvis programmerbarhed ønskes, men malware er uacceptabel, bruges et stærkt begrænset sprog. Sådan fungerer Java , JavaScript , mange af smartphone-operativsystemerne, inklusive Android . Denne ordning løser også andre problemer - den giver uafhængighed af processorarkitekturen, forenkler programmering, programfejl fører ikke til fejl i hele systemet. Ulempe: ekstrem kompleksitet af systemet og deraf følgende vanskelige sikkerhedstjek, dårlig ydeevne.

Noter

  1. Hvad har WebLogic, WebSphere, JBoss, Jenkins, OpenNMS og din applikation til fælles? Denne sårbarhed
  2. ldd vilkårlig kodeudførelse