Ühe haavatavuse kohta ...

Ühe haavatavuse kohta ...

Aasta tagasi, 21. mĂ€rtsil 2019, Mail.Ru bug bounty programm saabus HackerOne'ile vĂ€ga hea veateade alates maxarr. Kui ĂŒhte POST-parameetrit, mis kuulus veebiposti API-pĂ€ringule, mis tagastas HTTP-ĂŒmbersuunamise, sisestati nullbyte (ASCII 0), ilmus ĂŒmbersuunamise andmetes nĂ€htavale die-iniitiialiseeritud mĂ€lu fragmente, kus tihti paljastusid fragmendid sama serveri teiste pĂ€ringute GET-parameetritest ja pĂ€istest.

See on kriitiline haavatavus, kuna pĂ€ringud sisaldavad ka sessioonikĂŒpsiseid. MĂ”ne tunni pĂ€rast tehti ajutine parandamine, mis filtreeris nullbyte'i (kui hiljem selgus, et see ei olnud piisav, kuna CRLF / ASCII 13, 10 sĂŒstimise vĂ”imalus jĂ€i alles, mis vĂ”imaldab manipuleerida HTTP-vastuse pĂ€iste ja andmetega; see on vĂ€hem kriitiline, kuid siiski ebameeldiv). Samal ajal anti probleem turvaanalĂŒĂŒtikutele ja arendajatele, et leida ja kĂ”rvaldada vea tekkimise pĂ”hjused.

Mail.ru post on vĂ€ga keeruline rakendus, mille vastuse koostamisel vĂ”ib osaleda palju erinevaid frontend / backend komponente, nii avatud lĂ€htekoodiga (suur tĂ€nu kĂ”igile avatud tarkvara arendajatele) kui ka oma arendusega. Õnnestus vĂ€lja jĂ€tta kĂ”ik komponendid peale nginx'i ja openresty ning lokaliseerida probleem ĂŒleskutse juurde ngx.req.set_uri() OpenResty skripti, mis ei kĂ€itunud nii, nagu oodati (nullbyte'i vĂ”i reavahetuse sisestamine lĂ€bi GET-parameetrite, kasutades rewrite ngx_http_rewrite_module'is, mis, dokumentatsiooni kohaselt, on kasutusel ja peaks töötama tĂ€pselt samamoodi, ei olnud vĂ”imalik). KĂ”ik vĂ”imalikud tagajĂ€rjed kĂ”rvaldatud, rakendatud maksimaalselt range filtreerimine ja kontrollitud, et filtreerimine suudab kĂ”rvaldada kĂ”ik vĂ”imalikud vektorid. Kuid mehhanism, mis pĂ”hjustas mĂ€lu sisu lekke, jĂ€i siiski mĂ”istatuseks. Kuu aja pĂ€rast suleti vea raport lahendatuks, kuid vea tekkimise pĂ”hjuse analĂŒĂŒs lĂŒkati edasi paremate aegade poole.

OpenResty on vÀga populaarne plugin, mis vÔimaldab kirjutada Lua skripte nginx'i sees, ning seda kasutatakse mitmetes Mail.ru projektides, seetÔttu ei peetud probleemi lahendatuks. Ja mÔne aja pÀrast naasid nad selle juurde, et mÔista tÔelisi pÔhjuseid, vÔimalikke tagajÀrgi ja koostada soovitusi arendajatele. Algse koodi uurimisel osalesid Denis Denisov ja Nikolai ErmiƥkinSelgus, et:

  • Nginx-i kasutamisel on rewrite ja kasutajaandmete puhul teatud konfiguratsioonides vĂ”imalik directory traversal (ja tĂ”enĂ€oliselt ka SSRF), kuid see on tuntud probleem ja see peaks olema avastatud konfiguratsioonide staatiliste analĂŒsaatorite abil. Nginx Amplify ja Gixy Yandexilt (jah, me kasutame seda ka, aitĂ€h). OpenResty kasutamisel on selline vĂ”imalus kergesti tĂ€helepanuta jĂ€etud, kuid meie konfiguratsioon ei puudutanud seda.

    konfiguratsiooni nÀide:

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

    tulemus

    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-is on viga, mis pĂ”hjustab mĂ€lu sisu leket, kui rewrite string sisaldab nullbaiti. Ümbersuunamise korral eraldab Nginx uue mĂ€lupuhvri, mis vastab kogu stringi pikkusele, kuid kopeerib sinna stringi lĂ€bi stringifunktsiooni, kus nullbait on stringi terminaator, seetĂ”ttu kopeeritakse string ainult kuni nullbaitini, puhvri ĂŒlejÀÀnud osa sisaldab algatamata andmeid. Üksikasjalikku analĂŒĂŒsi saab leida siin.

    konfiguratsiooni nÀide (^@ nullbait)

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

    tulemus
    curl localhost:8337/secret -vv
    ...
    curl localhost:8337/memleak -vv
    ...
    Asukoht: http://localhost:8337/secret
    ...

  • Nginx kaitseb GET parameetreid spetsiaalsete mĂ€rkide sĂŒstimise eest ning vĂ”imaldab rewrite'is kasutada ainult GET parameetreid. SeetĂ”ttu ei ole Nginx-is vĂ”imalik Ă€ra kasutada sĂŒstimist, mis toimub kasutaja kontrollitavate parameetrite kaudu. POST parameetrid ei ole seevastu kaitstud. OpenResty vĂ”imaldab töötada nii GET kui ka POST parameetritega, seetĂ”ttu tekib OpenResty kasutamisel POST parameetrite kaudu vĂ”imalus spetsiaalsete mĂ€rkide sĂŒstimiseks.

    konfiguratsiooni nÀide:

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

    tulemus:

    curl localhost:8337 -d "url=secret" -vv
    ...
    curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
    ...
    Asukoht: http://localhost:8337/{...vÔib sisaldada secret...}
    ...

Edasine reaktsioon

Probleemist teavitati Nginx ja OpenResty arendajaid, arendajad ei pea probleemi Nginx-is turvaveaks, kuna Nginx-is ei ole vĂ”imalik ekspluateerida viga spetsiaalsete mĂ€rkide sĂŒstimise kaudu, parandamine mĂ€lu sisu leke avaldati 16. detsembril. 4 kuu jooksul alates raporteerimist ei ole OpenRestys samuti tehtud mingeid muudatusi, kuigi oli arusaam, et vajalik on ohutu variant funktsioonile ngx.req.set_uri(). 18. mĂ€rtsil 2020 avaldasime teabe, 21. mĂ€rtsil vabastas OpenResty versiooni 1.15.8.3, mis lisas URI kontrollimise.

Portswigger kirjutas hea hea artikkel ja vĂ”ttis kommentaarid OpenResty ja Nginxi kohta (kuigi kommentaar, et paljastatakse ainult vĂ€ike mĂ€lufragmente, on vale ja eksitav, see sĂ”ltub nullbaiti jĂ€rgnevast stringist ja, kui puuduvad selged pikkusepiirangud, vĂ”ib seda rĂŒnnakute eest kontrollida).

Mis oli viga ja mida teha, et seda vÀltida?

Kas viga oli nginxis? Jah, see oli, kuna mÀlu sisu lekke on igal juhul viga.

Kas oli viga OpenRestys? Jah, vĂ€hemalt ei uuritud ega dokumenteeritud pakutava OpenResty funktsionaalsuse turvakĂŒsimusi.

Kas oli konfiguratsiooni/vÀÀrkasutuse viga OpenRestys? Jah, kuna selgeid juhiseid puudumisel tehti kontrollimata eeldus kasutatud funktsionaalsuse turvalisuse kohta.

Milline neist vigadest on turvaaugu, mille baunti vÀÀrtus on $10000? Meie jaoks pole see pÔhimÔtteliselt oluline. Igas tarkvaras, eriti erinevate komponentide ristumiskohas, eriti erinevate projektide ja arendajate poolt pakutavas, ei saa keegi kunagi garanteerida, et kÔik selle töö omadused on tuntud ja dokumenteeritud ning vigu ei ole. Seega tekib iga turvaauk seal, kus see mÔjutab turvalisust.

Igal juhul on hea tava normaliseerida vĂ”i maksimaalselt piirata/filtreerida sisendeid, mis suunduvad igasse vĂ€limisse moodulisse/API-sse, kui puuduvad selged juhised ja ĂŒheselt mĂ”istetav arusaam, et seda ei nĂ”uta.

Errata

Kogemuse pÔhjal eelnevas artiklis, et sÀilitada keele puhtus:

bug bounty — vigade jahimise konkurss
veateade — vea teatis
redirect — ĂŒmbersuunamine
avaldatud — avatud koodiga
errata — vigade parandamine

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster