
Aasta tagasi, 21. mĂ€rtsil 2019, saabus HackerOne'ile vĂ€ga hea alates . 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 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 ja Selgus, 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. ja 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 .
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 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 , mis lisas URI kontrollimise.
Portswigger 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 , et sÀilitada keele puhtus:
bug bounty â vigade jahimise konkurss
veateade â vea teatis
redirect â ĂŒmbersuunamine
avaldatud â avatud koodiga
errata â vigade parandamine
Allikas: habr.com
