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