Iwwer eng Schwachstelle bei ...

Iwwer eng Schwachstelle bei ...

Virun engem Joer, den 21. Mäerz 2019, an Käfer Bounty Programm Mail.Ru eng ganz gutt koum HackerOne Feeler Rapport от max. Beim Aféierung vun engem Nullbyte (ASCII 0) an de POST-Parameter vun enger vun de Webmail API-Ufroen, déi en HTTP-Redirect zréckginn, waren Stécker vun oninitialiséierter Erënnerung an de Viruleedungsdaten siichtbar, an deenen Fragmenter aus GET-Parameteren an Header vun aneren Ufroen un den selwechte Server.

Dëst ass eng kritesch Schwachstelle well ... Ufroen enthalen och Sessiouns-Cookien. E puer Stonne méi spéit gouf eng temporär Fixéierung gemaach, déi den Nullbyte gefiltert huet (wéi et spéider erausgestallt gouf, war dëst net genuch, well et nach ëmmer d'Méiglechkeet war CRLF / ASCII 13, 10 ze sprëtzen, wat Iech erlaabt d'Header ze manipuléieren an Daten vun der HTTP Äntwert, dëst ass manner kritesch, awer nach ëmmer désagréabel). Zur selwechter Zäit gouf de Problem un d'Sécherheetsanalytiker an d'Entwéckler iwwerginn fir d'Ursaachen vum Käfer ze fannen an ze eliminéieren.

Mail.ru Mail ass eng ganz komplex Applikatioun; eng grouss Zuel vu verschiddene Front-End/Back-End Komponenten, souwuel Open Source (vill Merci un all gratis Software Entwéckler) an intern entwéckelt, kënne bei der Generatioun vun der Äntwert involvéiert sinn. Mir hunn et fäerdeg bruecht all Komponenten auszeschléissen ausser nginx an openresty an de Problem lokaliséieren ier Dir urufft ngx.req.set_uri() an engem OpenResty Skript deen sech net wéi erwaart huet (en Nullbyte oder Zeilfeed iwwer GET Parameteren mat Rewrite an ngx_http_rewrite_module asetzen, deen, laut der Dokumentatioun, benotzt gëtt an, wéi et schéngt, genee déi selwecht Manéier soll funktionnéieren, wäert net schaffen). Méiglech Konsequenze goufen éliminéiert, Filterung gouf esou strikt wéi méiglech bäigefüügt, a Filterung gouf verifizéiert fir all méiglech Vektoren ze eliminéieren. Awer de Mechanismus, deen zum Leck vum Erënnerungsinhalt gefouert huet, blouf e Geheimnis. E Mount méi spéit gouf de Feelerbericht zougemaach wéi geléist, an d'Analyse vun den Ursaachen vum Käfer gouf bis besser Zäiten ausgestallt.

OpenResty ass e ganz populäre Plugin deen Iech erlaabt Lua Scripte bannent nginx ze schreiwen, an et gëtt a verschiddene Mail.ru Projete benotzt, sou datt de Problem net als geléist ugesi gouf. An no enger Zäit si se endlech zréck op et fir déi richteg Grënn, méiglech Konsequenzen ze verstoen an Empfehlungen fir Entwéckler ze maachen. Bei der Ausgruewung vum Quellcode deelgeholl Denis Denisov и Nikolay Ermishkin. Et huet sech erausgestallt:

  • Am nginx, wann Dir Rewrite mat Benotzerdaten benotzt, gëtt et d'Méiglechkeet vu Verzeechnestransfer (a wahrscheinlech SSRF) an e puer Konfiguratiounen, awer dëst ass e bekannte Fakt a soll vu statesche Konfiguratiounsanalysatoren entdeckt ginn Nginx Amplify и gixy aus Yandex (jo, mir benotzen dat och, merci). Wann Dir OpenResty benotzt, ass dës Feature einfach ze verpassen, awer dëst huet eis Konfiguratioun net beaflosst.

    Konfiguratioun Beispill:

    location ~ /rewrite {
        rewrite ^.*$ $arg_x;
    }
    
    location / {
        root html;
        index index.html index.htm;
    }

    Effekt

    curl localhost:8337/rewrite?x=/../../../../../../../etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    ...

  • Nginx huet e Feeler, deen d'Erënnerung leeft wann d'Rewrite Linn en null Byte enthält. Wann e Viruleedung ausgestallt gëtt, allokéiert nginx en neien Erënnerungspuffer deen der ganzer Längt vun der Linn entsprécht, awer kopéiert d'Linn do duerch eng Zeilfunktioun an där den Nullbyte e Linnterminator ass, sou datt d'Linn nëmmen bis op den Null kopéiert gëtt. byte; de ​​Rescht vum Puffer enthält oninitialiséiert Daten. Eng detailléiert Analyse kann fonnt ginn hei.

    Konfiguratiounsbeispiel (^@ Null Byte)

    
    location ~ /memleak {
        rewrite ^.*$ "^@asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdasdf";
    }
    
    location / {
        root html;
        index index.html index.htm;
    }

    Effekt
    curl localhost:8337/secret -vv
    ...
    curl localhost:8337/memleak -vv
    ...
    Location: http://localhost:8337/secret
    ...

  • Nginx schützt GET Parameteren aus Injektioun vu Service Charaktere a mécht et méiglech nëmmen GET Parameteren am Rewrite ze benotzen. Dofir ass et net méiglech d'Injektioun duerch Benotzerkontrolléiert Parameteren an nginx auszenotzen. POST Parameteren sinn net geschützt. OpenResty erlaabt Iech souwuel mat GET wéi och POST Parameteren ze schaffen, also wann Dir POST Parameteren duerch OpenResty benotzt, gëtt et méiglech speziell Zeechen ze sprëtzen.

    Konfiguratioun Beispill:

    location ~ /memleak {
        rewrite_by_lua_block {
            ngx.req.read_body();
            local args, err = ngx.req.get_post_args();
            ngx.req.set_uri( args["url"], true );
        }
    }
    
    location / {
        root html;
        index index.html index.htm;
    }
    

    Resultat:

    curl localhost:8337 -d "url=secret" -vv
    ...
    curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
    ...
    Location: http://localhost:8337/{...может содержать secret...}
    ...

Weider Reaktioun

De Problem gouf un d'Entwéckler vun nginx an OpenResty gemellt, d'Entwéckler betruechten de Problem net als Sécherheetsfehler an nginx, well an nginx selwer gëtt et kee Wee fir de Feeler auszenotzen duerch d'Injektioun vu speziellen Zeechen, fix Erënnerung Offenbarung gouf de 16. Dezember publizéiert. An de 4 Méint zënter dem Bericht sinn keng Ännerunge fir OpenResty gemaach ginn, obwuel et e Verständnis war datt eng sécher Versioun vun der ngx.req.set_uri () Funktioun gebraucht gouf. Den 18. Mäerz 2020 hu mir Informatioun verëffentlecht, den 21. Mäerz huet OpenResty verëffentlecht Versioun 1.15.8.3, wat d'URI Validatioun bäidréit.

Portswigger geschriwwen gudden Artikel an huet Kommentarer vun OpenResty an Nginx geholl (obwuel de Kommentar datt nëmmen e klenge Fragment vun der Erënnerung ausgesat ass falsch a irféierend ass, gëtt dëst bestëmmt duerch d'Längt vun der Linn no der Nullbyte an, an der Verontreiung vu explizit Restriktiounen op der Längt, kann vum Ugräifer kontrolléiert ginn).

Also wat war de Feeler a wat ka gemaach ginn fir et ze vermeiden?

War et e Feeler am nginx? Jo, et war, well d'Erënnerungsinhalter lekken ass op alle Fall e Feeler.

War et e Feeler an OpenResty? Jo, op d'mannst d'Fro vun der Sécherheet vun der Funktionalitéit vun OpenResty ass net ënnersicht an dokumentéiert ginn.

War et eng Konfiguratioun / Benotzungsfehler mat OpenResty? Jo, well an der Verontreiung vun enger explizit Ausso gouf eng onverifizéiert Viraussetzung gemaach iwwer d'Sécherheet vun der Funktionalitéit déi benotzt gëtt.

Wéi eng vun dëse Bugs ass eng Sécherheetsschwaachheet mat enger $ 10000 Bounty? Fir eis ass dat allgemeng net wichteg. An all Software, besonnesch op der Kräizung vu verschiddene Komponenten, besonnesch déi vu verschiddene Projeten an Entwéckler, ka kee garantéieren datt all d'Features vun hirer Aarbecht bekannt an dokumentéiert sinn an datt et keng Feeler gëtt. Dofir geschitt all Sécherheetsschwaachheet genau wou se d'Sécherheet beaflosst.

Op alle Fall ass et eng gutt Praxis fir d'Inputdaten, déi an all externe Modul / API ginn, ze normaliséieren oder ze limitéieren / ze filteren sou vill wéi méiglech, ausser et gëtt explizit Instruktiounen an e kloert Verständnis datt dëst net erfuerderlech ass.

Erratum

Vun Erfahrung virdrun Artikel, fir d'Rengheet vun der Sprooch ze erhalen:

Bug Bounty - Käfer Juegd Concours
Feeler Rapport - Feeler Notifikatioun
Viruleedung - Viruleedung
oppe Quell - Open Source
erratum - Aarbecht op Feeler

Source: will.com

Setzt e Commentaire