Apeprè yon vilnerabilite nan...

Apeprè yon vilnerabilite nan...

Yon ane de sa, 21 mas 2019, nan pwogram bounty ensèk Mail.Ru yon trè bon te vin jwenn HackerOne rapò ensèk soti nan maxarr. Lè yo te entwodwi yon byte zewo (ASCII 0) nan paramèt POST la nan youn nan demann API webmail ki te retounen yon redireksyon HTTP, moso memwa ki pa inisyalize yo te vizib nan done redireksyon yo, nan ki fragman ki soti nan paramèt GET yo ak en-tèt lòt demann bay la. menm sèvè.

Sa a se yon vilnerabilite kritik paske... demann yo genyen tou bonbon sesyon yo. Kèk èdtan apre, yo te fè yon ranje tanporè ki te filtre zewo byte a (jan li te tounen soti pita, sa a pa t 'ase, paske te toujou posiblite pou enjekte CRLF / ASCII 13, 10, ki pèmèt ou manipile tèt yo ak done repons HTTP, sa a se mwens kritik, men li toujou dezagreyab). An menm tan an, pwoblèm nan te transfere nan analis sekirite ak devlopè yo jwenn ak elimine kòz yo nan ensèk la.

Mail.ru lapòs se yon aplikasyon trè konplèks; yon gwo kantite diferan konpozan front-end / back-end, tou de sous louvri (anpil gras a tout devlopè lojisyèl gratis) ak nan kay devlope, ka patisipe nan jenere repons lan. Nou jere yo eskli tout eleman eksepte nginx ak openresty epi lokalize pwoblèm nan anvan ou rele ngx.req.set_uri() nan yon script OpenResty ki pa t 'konpòte jan yo te espere (insere yon byte nil oswa liy feed atravè paramèt GET ak reekri nan ngx_http_rewrite_module, ki, dapre dokiman an, yo itilize epi, li ta sanble, ta dwe travay nan egzakteman menm jan an, pral pa travay). Konsekans posib yo te elimine, yo te ajoute filtraj otank posib, epi yo te verifye filtraj pou elimine tout vektè posib. Men, mekanis ki te mennen nan koule nan kontni memwa rete yon mistè. Yon mwa apre, rapò ensèk la te fèmen kòm rezoud, epi analiz la nan kòz yo nan ensèk la te ranvwaye jiskaske pi bon moman.

OpenResty se yon plugin trè popilè ki pèmèt ou ekri script Lua andedan nginx, epi li itilize nan plizyè pwojè Mail.ru, kidonk pwoblèm nan pa te konsidere kòm rezoud. Apre kèk tan, yo finalman retounen nan li yo nan lòd yo konprann rezon ki fè yo vre, konsekans posib epi fè rekòmandasyon pou devlopè yo. Patisipe nan fouyman nan kòd sous la Denis Denisov и Nikolay Ermishkin. Li te vin ke:

  • Nan nginx, lè w ap itilize reekri ak done itilizatè, gen posiblite pou travèse anyè (ak pwobableman SSRF) nan kèk konfigirasyon, men sa a se yon reyalite li te ye epi yo ta dwe detekte pa analizè konfigirasyon estatik nan. Nginx anplifye и gixy soti nan Yandex (wi, nou itilize sa tou, mèsi). Lè w ap itilize OpenResty, karakteristik sa a fasil pou rate, men sa pa afekte konfigirasyon nou an.

    egzanp konfigirasyon:

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

    rezilta

    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 gen yon ensèk ki lakòz memwa koule si liy reekri a gen yon byte nil. Lè yo bay yon redireksyon, nginx asiyen yon nouvo tanpon memwa ki koresponn ak tout longè liy lan, men kopye liy lan la atravè yon fonksyon liy kote zewo byte a se yon terminateur liy, kidonk liy lan kopye sèlman jiska zewo a. byte; rès tanpon an gen done ki pa inisyalize. Ou ka jwenn yon analiz detaye isit la.

    egzanp konfigirasyon (^@ zewo byte)

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

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

  • Nginx pwoteje paramèt GET nan piki karaktè sèvis epi li fè li posib pou itilize sèlman paramèt GET nan reekri. Se poutèt sa, li pa posib eksplwate piki nan paramèt itilizatè yo kontwole nan nginx. Paramèt POST yo pa pwoteje. OpenResty pèmèt ou travay ak tou de paramèt GET ak POST, kidonk lè w ap itilize paramèt POST atravè OpenResty, li vin posib pou enjekte karaktè espesyal.

    egzanp konfigirasyon:

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

    rezilta:

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

Pli lwen reyaksyon

Pwoblèm nan te rapòte bay devlopè yo nan nginx ak OpenResty, devlopè yo pa konsidere pwoblèm nan kòm yon ensèk sekirite nan nginx, paske nan nginx tèt li pa gen okenn fason yo eksplwate erè a nan piki a nan karaktè espesyal, ranje divilgasyon memwa te pibliye 16 desanm. Nan 4 mwa yo depi rapò a, pa gen okenn chanjman ki fèt nan OpenResty, byenke te gen yon konpreyansyon ke yon vèsyon an sekirite nan fonksyon ngx.req.set_uri() te nesesè. Sou 18 mas 2020 nou pibliye enfòmasyon, sou 21 mas OpenResty lage vèsyon 1.15.8.3, ki ajoute validation URI.

Portswigger te ekri bon atik epi li te pran kòmantè nan OpenResty ak Nginx (byenke kòmantè a ke se sèlman yon ti fragman nan memwa ekspoze se kòrèk ak twonpe, sa a se detèmine pa longè liy ki apre byte a nil epi, nan absans la nan restriksyon eksplisit sou la. longè, ka kontwole pa atakè a).

Se konsa, ki sa ki te erè a ak sa ki ka fè pou anpeche li?

Èske te gen yon ensèk nan nginx? Wi, li te, paske kontni memwa koule se yon erè nan nenpòt ka.

Èske te gen yon ensèk nan OpenResty? Wi, omwen pwoblèm nan sekirite nan fonksyonalite yo ofri nan OpenResty yo pa te envestige ak dokimante.

Èske te gen yon erè konfigirasyon/itilize ak OpenResty? Wi, paske nan absans yon deklarasyon eksplisit, yo te fè yon sipozisyon ki pa verifye sou sekirite fonksyonalite yo te itilize a.

Kilès nan ensèk sa yo se yon vilnerabilite sekirite ak yon bounty $ 10000? Pou nou, sa a jeneralman pa enpòtan. Nan nenpòt lojisyèl, espesyalman nan entèseksyon plizyè konpozan, espesyalman sa yo bay pa diferan pwojè ak devlopè, pèsonn pa ka janm garanti ke tout karakteristik yo nan travay yo konnen ak dokimante e ke pa gen okenn erè. Se poutèt sa, nenpòt vilnerabilite sekirite rive egzakteman kote li afekte sekirite.

Nan nenpòt ka, li se bon pratik nòmalize oswa limite / filtre otank posib done yo antre ki ale nan nenpòt modil ekstèn / API, sof si gen enstriksyon eksplisit ak yon konpreyansyon klè ke sa a pa obligatwa.

Erata

Pa eksperyans atik anvan, pou dedomajman pou prezève pite lang nan:

bounty ensèk — konpetisyon lachas ensèk
rapò ensèk - notifikasyon erè
redireksyon - redireksyon
sous louvri - sous louvri
eratòm - travay sou erè

Sous: www.habr.com

Add nouvo kòmantè