Madwar vulnerabbiltà waħda fi...

Madwar vulnerabbiltà waħda fi...

Sena ilu, 21 ta’ Marzu 2019, fi bug bounty programm Mail.Ru waħda tajba ħafna waslet għal HackerOne rapport tal-bug minn maxarr. Meta daħħal byte żero (ASCII 0) fil-parametru POST ta 'waħda mit-talbiet tal-API tal-webmail li rritornat redirect HTTP, biċċiet ta' memorja mhux inizjalizzata kienu viżibbli fid-dejta ta 'ridirezzjoni, li fiha frammenti minn parametri GET u headers ta' talbiet oħra lill- l-istess server.

Din hija vulnerabbiltà kritika għaliex... talbiet fihom ukoll cookies tas-sessjoni. Ftit sigħat wara, saret soluzzjoni temporanja li ffiltrat il-byte żero (kif irriżulta aktar tard, dan ma kienx biżżejjed, minħabba li kien għad hemm il-possibbiltà li tinjetta CRLF / ASCII 13, 10, li tippermettilek timmanipula l-headers u data tar-rispons HTTP, dan huwa inqas kritiku, iżda għadu mhux pjaċevoli). Fl-istess ħin, il-problema ġiet trasferita lill-analisti tas-sigurtà u lill-iżviluppaturi biex isibu u jeliminaw il-kawżi tal-bug.

Il-posta Mail.ru hija applikazzjoni kumplessa ħafna; għadd kbir ta’ komponenti front-end/back-end differenti, kemm sors miftuħ (ħafna grazzi għall-iżviluppaturi kollha ta’ softwer b’xejn) kif ukoll żviluppati internament, jistgħu jkunu involuti fil-ġenerazzjoni tar-rispons. Irnexxielna neskludu l-komponenti kollha ħlief nginx u openresty u nillokalizzaw il-problema qabel inċemplu ngx.req.set_uri() fi skript OpenResty li ma ġabx ruħu kif mistenni (ddaħħal byte null jew line feed permezz ta’ parametri GET b’kitba mill-ġdid f’ngx_http_rewrite_module, li, skont id-dokumentazzjoni, tintuża u, jidher, għandha taħdem eżattament bl-istess mod, se ma jaħdmux). Il-konsegwenzi possibbli ġew eliminati, il-filtrazzjoni ġie miżjud b'mod strett kemm jista 'jkun, u l-filtrazzjoni ġiet ivverifikata biex jiġu eliminati l-vettori kollha possibbli. Iżda l-mekkaniżmu li wassal għat-tnixxija tal-kontenut tal-memorja baqa 'misteru. Xahar wara, ir-rapport tal-bug ingħalaq kif solvut, u l-analiżi tal-kawżi tal-bug ġiet posposta għal żminijiet aħjar.

OpenResty huwa plugin popolari ħafna li jippermettilek tikteb skripts Lua ġewwa nginx, u jintuża f'diversi proġetti Mail.ru, għalhekk il-problema ma kinitx ikkunsidrata solvuta. U wara xi żmien, fl-aħħar irritornaw għaliha sabiex jifhmu r-raġunijiet veri, il-konsegwenzi possibbli u jagħmlu rakkomandazzjonijiet għall-iżviluppaturi. Ipparteċipaw fit-tħaffir tal-kodiċi tas-sors Denis Denisov и Nikolay Ermishkin. Irriżulta li:

  • F'nginx, meta tuża l-kitba mill-ġdid b'dejta tal-utent, hemm il-possibbiltà ta' traversal tad-direttorju (u probabbilment SSRF) f'xi konfigurazzjonijiet, iżda dan huwa fatt magħruf u għandu jiġi skopert minn analizzaturi tal-konfigurazzjoni statika f' Nginx Amplifika и gixy minn Yandex (iva, nużaw dan ukoll, grazzi). Meta tuża OpenResty, din il-karatteristika hija faċli li tintilef, iżda dan ma affettwax il-konfigurazzjoni tagħna.

    Eżempju ta' konfigurazzjoni:

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

    riżultat

    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 għandu bug li jikkawża tnixxija tal-memorja jekk il-linja tal-kitba mill-ġdid fiha byte null. Meta tinħareġ redirect, nginx jalloka buffer tal-memorja ġdid li jikkorrispondi għat-tul sħiħ tal-linja, iżda jikkopja l-linja hemmhekk permezz ta 'funzjoni tal-linja li fiha l-byte żero huwa terminatur tal-linja, għalhekk il-linja tiġi kkupjata biss sa ż-żero. byte; il-bqija tal-buffer fih data mhux inizjali. Tista' tinstab analiżi dettaljata hawn.

    Eżempju ta' konfigurazzjoni (^@ zero byte)

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

    riżultat
    curl localhost:8337/secret -vv
    ...
    curl localhost:8337/memleak -vv
    ...
    Location: http://localhost:8337/secret
    ...

  • Nginx jipproteġi l-parametri GET mill-injezzjoni ta 'karattri tas-servizz u jagħmilha possibbli li jintużaw biss parametri GET fil-kitba mill-ġdid. Għalhekk, mhuwiex possibbli li tiġi sfruttata l-injezzjoni permezz ta 'parametri kkontrollati mill-utent f'nginx. Il-parametri POST mhumiex protetti. OpenResty jippermettilek taħdem kemm bil-parametri GET kif ukoll POST, għalhekk meta tuża l-parametri POST permezz ta 'OpenResty, isir possibbli li tinjetta karattri speċjali.

    Eżempju ta' konfigurazzjoni:

    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;
    }
    

    riżultat:

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

Aktar reazzjoni

Il-problema ġiet irrappurtata lill-iżviluppaturi ta 'nginx u OpenResty, l-iżviluppaturi ma jqisux il-problema bħala bug ta' sigurtà f'nginx, minħabba li f'nginx innifsu m'hemm l-ebda mod biex tisfrutta l-iżball permezz tal-injezzjoni ta 'karattri speċjali, tiffissa żvelar tal-memorja ġie ppubblikat fis-16 ta’ Diċembru. Fl-4 xhur mir-rapport, ma saru l-ebda bidliet lil OpenResty, għalkemm kien hemm fehim li verżjoni sigura tal-funzjoni ngx.req.set_uri() kienet meħtieġa. Fit-18 ta 'Marzu, 2020 ippubblikajna informazzjoni, fil-21 ta' Marzu ħarġet OpenResty verżjoni 1.15.8.3, li żżid il-validazzjoni tal-URI.

Portswigger kiteb artiklu tajjeb u ħa kummenti minn OpenResty u Nginx (għalkemm il-kumment li framment żgħir biss tal-memorja huwa espost huwa żbaljat u qarrieqi, dan huwa ddeterminat mit-tul tal-linja wara l-byte null u, fin-nuqqas ta’ restrizzjonijiet espliċiti fuq il- tul, jistgħu jiġu kkontrollati mill-attakkant).

Allura x'kien l-iżball u x'jista' jsir biex jiġi evitat?

Kien hemm bug f'nginx? Iva, kien, minħabba li tnixxi l-kontenut tal-memorja huwa żball fi kwalunkwe każ.

Kien hemm xi bug f'OpenResty? Iva, għall-inqas il-kwistjoni tas-sigurtà tal-funzjonalità offruta minn OpenResty ma ġietx investigata u dokumentata.

Kien hemm żball ta' konfigurazzjoni/użu ma' OpenResty? Iva, għaliex fin-nuqqas ta' dikjarazzjoni espliċita, saret suppożizzjoni mhux verifikata dwar is-sigurtà tal-funzjonalità li qed tintuża.

Liema minn dawn il-bugs hija vulnerabbiltà tas-sigurtà b'bounty ta' $10000? Għalina, dan ġeneralment mhuwiex importanti. Fi kwalunkwe softwer, speċjalment fl-intersezzjoni ta 'diversi komponenti, speċjalment dawk ipprovduti minn proġetti u żviluppaturi differenti, ħadd qatt ma jista' jiggarantixxi li l-karatteristiċi kollha tax-xogħol tagħhom huma magħrufa u dokumentati u li m'hemm l-ebda żbalji. Għalhekk, kwalunkwe vulnerabbiltà tas-sigurtà sseħħ eżattament fejn taffettwa s-sigurtà.

Fi kwalunkwe każ, hija prattika tajba li tiġi normalizzata jew limitata/iffiltrata kemm jista' jkun id-dejta tal-input li tidħol fi kwalunkwe modulu/API estern, sakemm ma jkunx hemm struzzjonijiet espliċiti u fehim ċar li dan mhux meħtieġ.

Marka ħażina

Mill-esperjenza artiklu preċedenti, għall-finijiet tal-preservazzjoni tal-purità tal-lingwa:

bug bounty — kompetizzjoni għall-kaċċa tal-bugs
rapport tal-bug - notifika ta' żball
direzzjoni mill-ġdid - direzzjoni mill-ġdid
sors miftuħ - sors miftuħ
erratum - taħdem fuq żbalji

Sors: www.habr.com

Żid kumment