Thart ar leochaileacht amháin i...

Thart ar leochaileacht amháin i...

Bliain ó shin, 21 Márta, 2019, ag clár bounty bug Mail.Ru tháinig ceann an-mhaith go HackerOne tuairisc ar fhabht ó maxarr. Nuair a tugadh beart nialasach (ASCII 0) isteach sa pharaiméadar POST de cheann de na hiarratais API ríomhphoist a sheol atreorú HTTP ar ais, bhí píosaí de chuimhne neamhchlóite le feiceáil sna sonraí atreoraithe, ina raibh blúirí ó pharaiméadair GET agus ceanntásca na n-iarratas eile ar an freastalaí céanna.

Is leochaileacht ríthábhachtach é seo toisc... tá fianáin seisiúin freisin in iarratais. Cúpla uair an chloig ina dhiaidh sin, rinneadh socrú sealadach a rinne scagadh ar an mbeart nialasach (mar a d'éirigh sé amach níos déanaí, ní raibh sé seo go leor, toisc go raibh an fhéidearthacht ann fós CRLF / ASCII 13, 10 a instealladh, rud a ligeann duit na ceanntásca a ionramháil agus sonraí an fhreagra HTTP, tá sé seo níos lú ríthábhachtach, ach fós míthaitneamhach). Ag an am céanna, aistríodh an fhadhb chuig anailísithe slándála agus forbróirí chun cúiseanna an fhabht a aimsiú agus a dhíchur.

Is feidhmchlár an-chasta é mail.ru mail; is féidir le líon mór comhpháirteanna tosaigh/deireadh cúil éagsúla, idir fhoinse oscailte (buíochas mór do gach forbróir bogearraí saor in aisce) agus a forbraíodh go hinmheánach, a bheith páirteach i nginiúint an fhreagra. D’éirigh linn gach comhpháirt a eisiamh ach amháin nginx agus openresty agus an fhadhb a logánú roimh ghlaoch ngx.req.set_uri() i script OpenResty nár éirigh leis mar a bhíothas ag súil leis (nasc beart nó fotha líne a chur isteach trí pharaiméadair GET le hathscríobh i ngx_http_rewrite_module, a úsáidtear, de réir an doiciméid, agus, de réir dealraimh, ba cheart go n-oibreodh sé ar an mbealach céanna, ní obair). Cuireadh deireadh le hiarmhairtí féideartha, cuireadh an scagadh chomh dian agus ab fhéidir, agus fíoraíodh an scagadh chun gach veicteoir féideartha a dhíchur. Ach d’fhan an mheicníocht ba chúis le sceitheadh ​​na n-ábhar cuimhne ina rúndiamhair. Mí ina dhiaidh sin, dúnadh an tuarascáil fabht mar a réitíodh, agus cuireadh an anailís ar chúiseanna an fhabht ar athló go dtí am níos fearr.

Is breiseán an-tóir é OpenResty a ligeann duit scripteanna Lua a scríobh taobh istigh nginx, agus úsáidtear é i roinnt tionscadal Mail.ru, mar sin níor measadh go raibh an fhadhb réitithe. Agus tar éis roinnt ama, d'fhill siad ar deireadh leis chun tuiscint a fháil ar na cúiseanna fíor, iarmhairtí féideartha agus moltaí a dhéanamh d'fhorbróirí. Ghlac sé páirt i dtochailt an chóid foinse Denis Denisov и Nikolay Ermishkin. Iompaigh sé amach go:

  • I nginx, agus athscríobh le sonraí úsáideora á n-úsáid, tá an fhéidearthacht ann trasnú eolaire (agus is dócha SSRF) i roinnt cumraíochtaí, ach is fíric aitheanta é seo agus ba cheart d'anailíseoirí cumraíochta statacha é a bhrath i Nginx Amplify и gixy ó Yandex (tá, úsáidimid é sin freisin, go raibh maith agat). Agus OpenResty á úsáid agat, is furasta an ghné seo a chailleann, ach níor chuir sé seo isteach ar ár gcumraíocht.

    sampla cumraíochta:

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

    mar thoradh ar

    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
    ...

  • Tá fabht ag Nginx a fhágann go sileadh cuimhne má tá beart nialasach sa líne athscríobh. Nuair a eisítear atreorú, leithdháileann nginx maolán cuimhne nua a fhreagraíonn do fhad iomlán na líne, ach déanann sé an líne a chóipeáil ansin trí fheidhm líne ina bhfuil an beart nialasach ina chríochnóir líne, mar sin ní dhéantar an líne a chóipeáil ach suas go dtí an nialas. beart; tá sonraí neamhthosaithe sa chuid eile den mhaolán. Is féidir anailís mhionsonraithe a fháil anseo.

    sampla cumraíochta (^@ náid beart)

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

    mar thoradh ar
    curl localhost:8337/secret -vv
    ...
    curl localhost:8337/memleak -vv
    ...
    Location: http://localhost:8337/secret
    ...

  • Cosnaíonn Nginx paraiméadair GET ó charachtair seirbhíse a instealladh agus is féidir paraiméadair GET amháin a úsáid in athscríobh. Dá bhrí sin, ní féidir leas a bhaint as instealladh trí pharaiméadair atá rialaithe ag an úsáideoir i nginx. Níl paraiméadair POST cosanta. Ligeann OpenResty duit oibriú le paraiméadair GET agus POST araon, mar sin agus paraiméadair POST á n-úsáid trí OpenResty, is féidir carachtair speisialta a instealladh.

    sampla cumraíochta:

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

    toradh:

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

Frithghníomh breise

Tuairiscíodh an fhadhb d'fhorbróirí nginx agus OpenResty, ní mheasann na forbróirí an fhadhb mar fhabht slándála i nginx, mar gheall ar i nginx féin níl aon bhealach chun leas a bhaint as an earráid trí instealladh carachtair speisialta, a shocrú nochtadh cuimhne foilsíodh ar 16 Nollaig. Sna 4 mhí ó foilsíodh an tuarascáil, níl aon athruithe déanta ar OpenResty, cé go raibh tuiscint ann go raibh gá le leagan sábháilte den fheidhm ngx.req.set_uri(). Ar an 18 Márta 2020 d’fhoilsíomar faisnéis, an 21 Márta arna scaoileadh ag OpenResty leagan 1.15.8.3, a chuireann bailíochtú URI leis.

Portswigger scríobh alt maith agus ghlac sé tuairimí ó OpenResty agus Nginx (cé go bhfuil an trácht nach bhfuil ach blúire beag de chuimhne mícheart agus míthreorach, déantar é seo a chinneadh ag fad na líne tar éis an beart nialasach agus, in éagmais srianta follasacha ar an mbeart). fad is féidir, a rialú ag an ionsaitheoir).

Mar sin, cad a bhí an botún agus cad is féidir a dhéanamh chun é a chosc?

An raibh fabht i nginx? Sea, bhí, toisc gur earráid é sceitheadh ​​ábhar cuimhne ar aon nós.

An raibh fabht in OpenResty? Sea, ar a laghad níl imscrúdú agus doiciméadú déanta ar cheist shlándáil na feidhmiúlachta a thairgeann OpenResty.

An raibh earráid cumraíochta/úsáide le OpenResty? Is féidir, mar in éagmais ráitis fhollasach, rinneadh toimhde neamhfhíoraithe faoi shlándáil na feidhme a bhí in úsáid.

Cé acu de na fabhtanna seo atá ina leochaileacht slándála le deolchaire $10000? Maidir linne, níl sé seo tábhachtach go ginearálta. In aon bhogearraí, go háirithe ag crosbhealach roinnt comhpháirteanna, go háirithe iad siúd a sholáthraíonn tionscadail agus forbróirí éagsúla, ní féidir le duine ar bith ráthaíocht a thabhairt go bhfuil gnéithe uile a gcuid oibre ar eolas agus doiciméadaithe agus nach bhfuil aon earráidí ann. Mar sin, tarlaíonn aon leochaileacht slándála go díreach nuair a chuireann sí isteach ar shlándáil.

Ar aon chuma, is dea-chleachtas é na sonraí ionchuir a théann isteach in aon mhodúl/API seachtrach a normalú nó a theorannú/scagadh a oiread agus is féidir, ach amháin má tá treoracha soiléire ann agus go bhfuil tuiscint shoiléir ann nach bhfuil gá leis sin.

Earráid

De réir taithí alt roimhe seo, ar mhaithe le híonacht na teanga a chaomhnú:

bounty fabht — comórtas seilg fabhtanna
tuairisc ar fhabht - fógra earráide
atreorú - atreorú
Foinse oscailte - Foinse oscailte
earráid - obair ar bhotúin

Foinse: will.com

Add a comment