Mu aon so-leòntachd ann an...

Mu aon so-leòntachd ann an...

O chionn bliadhna, 21 Màrt 2019, aig prògram bounty bug Mail.Ru thàinig fear fìor mhath gu HackerOne aithris air bug от maxarr. Nuair a thugadh a-steach neoni byte (ASCII 0) a-steach don paramadair POST de aon de na h-iarrtasan API post-lìn a thill ath-stiùireadh HTTP, bha pìosan de chuimhne neo-aithnichte rim faicinn anns an dàta ath-sheòlaidh, anns an robh criomagan bho pharaimearan GET agus cinn-cinn iarrtasan eile chun an an aon fhrithealaiche.

Tha seo na chunnart èiginneach leis gu bheil ... bidh briosgaidean seisean cuideachd ann an iarrtasan. Beagan uairean a-thìde às deidh sin, chaidh fuasgladh sealach a dhèanamh a shìoladh an neoni byte (mar a thàinig e a-mach nas fhaide air adhart, cha robh seo gu leòr, oir bha e comasach fhathast CRLF / ASCII 13, 10 a chuir a-steach, a leigeas leat na cinn-cinn agus na cinn a làimhseachadh. dàta den fhreagairt HTTP, chan eil seo cho èiginneach, ach fhathast mì-thlachdmhor). Aig an aon àm, chaidh an duilgheadas a ghluasad gu sgrùdairean tèarainteachd agus luchd-leasachaidh gus adhbharan a 'bhiast a lorg agus a chuir às.

Is e tagradh gu math iom-fhillte a th’ ann am post Mail.ru; faodaidh àireamh mhòr de dhiofar phàirtean aghaidh / cùil, gach cuid stòr fosgailte (mòran taing dha luchd-leasachaidh bathar-bog an-asgaidh) agus taobh a-staigh leasachadh, a bhith an sàs ann a bhith a’ gineadh an fhreagairt. Chaidh againn air a h-uile pàirt a chuir a-mach ach a-mhàin nginx agus openresty agus an duilgheadas a shuidheachadh gu h-ionadail mus cuir thu fios thugainn ngx.req.set_uri() ann an sgriobt OpenResty nach do ghiùlain mar a bhiodh dùil (cuir a-steach byte null no biadhadh loidhne tro pharaimearan GET le ath-sgrìobhadh ann an ngx_http_rewrite_module, a tha, a rèir na sgrìobhainnean, air a chleachdadh agus, a rèir coltais, a bu chòir obrachadh san aon dòigh, gun obair). Chaidh cuir às do bhuilean a dh’ fhaodadh a bhith ann, chaidh sìoladh a chuir ris cho teann ‘s a ghabhas, agus chaidh sìoladh a dhearbhadh gus cuir às do gach vectar a dh’ fhaodadh a bhith ann. Ach bha an uidheamachd a lean gu aodion susbaint cuimhne fhathast na dhìomhaireachd. Mìos às deidh sin, chaidh an aithisg air bug a dhùnadh mar a chaidh a rèiteach, agus chaidh an sgrùdadh air adhbharan a’ bhiast a chuir dheth gu amannan nas fheàrr.

Tha OpenResty na plugan mòr-chòrdte a leigeas leat sgriobtaichean Lua a sgrìobhadh taobh a-staigh nginx, agus tha e air a chleachdadh ann an grunn phròiseactan Mail.ru, agus mar sin cha deach beachdachadh air an duilgheadas fhuasgladh. Agus às deidh beagan ùine, thill iad thuige mu dheireadh gus na fìor adhbharan a thuigsinn, builean a dh’ fhaodadh a bhith ann agus molaidhean a dhèanamh do luchd-leasachaidh. A 'gabhail pàirt ann an cladhach a' chòd stòr Denis Denisov и Nikolay Ermishkin. Thionndaidh e a-mach gun robh:

  • Ann an nginx, nuair a bhios tu a’ cleachdadh ath-sgrìobhadh le dàta luchd-cleachdaidh, tha comas ann tionndadh eòlaire (agus is dòcha SSRF) ann an cuid de rèiteachaidhean, ach tha seo aithnichte agus bu chòir a bhith air a lorg le sgrùdairean rèiteachaidh statach ann an Nginx Meudaich и gixy bho Yandex (tha, bidh sinn a’ cleachdadh sin cuideachd, taing). Nuair a bhios tu a’ cleachdadh OpenResty, tha am feart seo furasta a chall, ach cha tug seo buaidh air an rèiteachadh againn.

    eisimpleir rèiteachaidh:

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

    buaidh

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

  • Tha bug aig Nginx a bheir air cuimhne a dhol a-mach ma tha null byte anns an loidhne ath-sgrìobhaidh. Nuair a thèid ath-sheòladh a chuir a-mach, bidh nginx a’ riarachadh bufair cuimhne ùr a rèir fad na loidhne, ach a’ dèanamh lethbhreac den loidhne an sin tro ghnìomh loidhne anns a bheil am byte neoni na chrìoch loidhne, agus mar sin cha tèid an loidhne a chopaigeadh ach suas gu neoni. byte; tha dàta neo-aithnichte anns a’ chòrr den bhufair. Gheibhear mion-sgrùdadh mionaideach an seo.

    eisimpleir rèiteachaidh (^@ zero byte)

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

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

  • Bidh Nginx a ’dìon paramadairean GET bho in-stealladh de charactaran seirbheis agus ga dhèanamh comasach dìreach paramadairean GET a chleachdadh ann an ath-sgrìobhadh. Mar sin, chan eil e comasach brath a ghabhail air in-stealladh tro pharaimearan fo smachd luchd-cleachdaidh ann an nginx. Chan eil crìochan POST air an dìon. Leigidh OpenResty leat obrachadh le gach cuid paramadairean GET agus POST, agus mar sin nuair a bhios tu a’ cleachdadh paramadairean POST tro OpenResty, bidh e comasach caractaran sònraichte a chuir a-steach.

    eisimpleir rèiteachaidh:

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

Freagairt a bharrachd

Chaidh an duilgheadas innse do luchd-leasachaidh nginx agus OpenResty, chan eil an luchd-leasachaidh a’ beachdachadh air an duilgheadas mar bhug tèarainteachd ann an nginx, oir ann an nginx fhèin chan eil dòigh ann brath a ghabhail air a’ mhearachd tro in-stealladh charactaran sònraichte, socraich foillseachadh cuimhne fhoillseachadh air 16 Dùbhlachd. Anns na 4 mìosan bhon aithisg, cha deach atharrachadh sam bith a dhèanamh air OpenResty, ged a bha tuigse ann gu robh feum air dreach sàbhailte den ghnìomh ngx.req.set_uri(). Air 18 Màrt 2020 dh’ fhoillsich sinn fiosrachadh, air 21 Màrt OpenResty air fhoillseachadh tionndadh 1.15.8.3, a chuireas ri dearbhadh URI.

Portswigger sgrìobh artaigil math agus ghabh e beachdan bho OpenResty agus Nginx (ged a tha am beachd nach eil ach criomag bheag de chuimhne air a nochdadh ceàrr agus meallta, tha seo air a dhearbhadh le fad na loidhne às deidh a’ null byte agus, às aonais cuingealachaidhean soilleir air an fad, faodaidh an neach-ionnsaigh smachd a chumail air).

Mar sin dè a bha am mearachd agus dè ghabhas dèanamh gus casg a chuir air?

An robh bug ann an nginx? Bha, bha, oir tha a bhith ag aoidion susbaint cuimhne na mhearachd co-dhiù.

An robh bug ann an OpenResty? Tha, co-dhiù cha deach cùis tèarainteachd a’ ghnìomhachd a tha OpenResty a thabhann a sgrùdadh agus a chlàradh.

An robh mearachd rèiteachaidh/cleachdaidh ann le OpenResty? Tha, oir às aonais aithris shoilleir, chaidh barail neo-dhearbhte a dhèanamh mu thèarainteachd a’ ghnìomhachd a thathar a’ cleachdadh.

Dè de na mialan sin a tha so-leòntachd tèarainteachd le bounty $ 10000? Dhuinne, sa chumantas chan eil seo cudromach. Ann am bathar-bog sam bith, gu h-àraidh nuair a tha grunn phàirtean eadar-dhealaichte, gu h-àraidh an fheadhainn a tha air an toirt seachad le diofar phròiseactan agus luchd-leasachaidh, chan urrainn dha duine a-riamh gealltainn gu bheil na feartan uile den obair aca aithnichte agus air an clàradh agus nach eil mearachdan ann. Mar sin, tha so-leòntachd tèarainteachd sam bith a’ tachairt dìreach far a bheil e a’ toirt buaidh air tèarainteachd.

Ann an suidheachadh sam bith, tha e na dheagh chleachdadh an dàta cuir a-steach a thèid a-steach do mhodal / API taobh a-muigh sam bith a dhèanamh àbhaisteach no a chuingealachadh / a shìoladh, mura h-eil stiùireadh soilleir agus tuigse shoilleir ann nach eil feum air.

Erratum

Bho eòlas artaigil roimhe, air son purrachd a' chànain a ghleidheadh ​​:

bounty bug - farpais sealg bhiastagan
aithris air bug - brath mearachd
ath-sheòladh - ath-stiùireadh
stòr fosgailte - stòr fosgailte
mearachd - obair air mearachdan

Source: www.habr.com

Cuir beachd ann