
Usa ka tuig ang milabay, niadtong Marso 21, 2019, Usa ka maayo kaayo nga miabot sa HackerOne gikan sa Sa dihang ang usa ka null byte (ASCII 0) gi-inject sa POST parameter sa usa ka webmail API request nga mibalik og HTTP redirect, ang mga tipak sa wala pa ma-initialize nga memorya makita sa redirect data, nga kasagaran nagpadayag og mga tipik gikan sa GET parameters ug headers sa ubang mga request ngadto sa samang server.
Kini usa ka kritikal nga kahuyangan, tungod kay ang mga hangyo adunay mga session cookies. Pipila ka oras ang milabay, usa ka temporaryo nga pag-ayo ang gipatuman nga nagsala sa null byte (sama sa nahibal-an sa ulahi, dili kini igo, tungod kay ang CRLF/ASCII 13, 10 injection nagpabilin nga posible, nga nagtugot sa pagmaniobra sa mga HTTP response header ug datos. Kini dili kaayo kritikal, apan makalagot gihapon). Sa samang higayon, ang isyu gibalhin ngadto sa mga security analyst ug mga developer aron imbestigahan ug ayohon ang hinungdan sa bug.
Ang Mail.ru Mail usa ka komplikado kaayo nga aplikasyon; daghang lain-laing mga frontend/backend components, parehong open source (daghang salamat sa tanang free software developers) ug proprietary, ang mahimong magamit sa pagmugna og tubag. Natangtang namo ang tanang components gawas sa nginx ug openresty ug nasulbad ang problema sa wala pa kini mahitabo. Usa ka OpenResty script ang wala damha nga naglihok (pagsulod og null byte o newline pinaagi sa GET parameters nga adunay rewrite sa ngx_http_rewrite_module, nga, sumala sa dokumentasyon, gigamit ug kinahanglan nga mogana nga parehas ra, wala molihok). Gisulbad ang posibleng mga sangputanan, gidugang ang labing estrikto nga pagsala, ug napamatud-an nga ang pagsala nagtangtang sa tanan nga posibleng mga vector. Apan ang mekanismo nga hinungdan sa memory leak nagpabilin nga misteryo. Paglabay sa usa ka bulan, ang bug report gisirado na human nasulbad, ug ang imbestigasyon sa hinungdan sa bug gi-postpone hangtod sa mas maayong mga panahon.
Ang OpenResty usa ka sikat kaayo nga plugin nga nagtugot sa pagsulat og Lua scripts sulod sa Nginx, ug gigamit kini sa daghang mga proyekto sa Mail.ru, busa ang isyu wala giisip nga nasulbad. Paglabay sa pipila ka panahon, kini gisusi pag-usab aron masabtan ang tinuod nga mga hinungdan, posibleng mga sangputanan, ug paghatag og mga rekomendasyon alang sa mga developer. Ang mosunod nga mga tawo miapil sa pagpangita sa source code: и Nahitabo nga:
- Sa nginx, kon mogamit og rewrite sa user data, adunay posibilidad sa directory traversal (ug lagmit SSRF) sa pipila ka mga configuration, apan kini usa ka nahibal-an nga kamatuoran ug kinahanglan nga mamatikdan sa mga static configuration analyzer sa и Gikan sa Yandex (oo, gigamit pud namo kini, salamat). Dali ra kaayo nga dili makita kini nga feature kon mogamit og OpenResty, apan wala kini makaapekto sa among configuration.
Ehemplo sa pag-configure:
location ~ /rewrite { rewrite ^.*$ $arg_x; } location / { root html; index index.html index.htm; }epekto
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
... - Ang Nginx adunay bug nga hinungdan sa memory leak kung ang rewrite string adunay null byte. Kung mag-isyu og redirect, ang Nginx mo-allocate og bag-ong memory buffer nga katumbas sa tibuok gitas-on sa string, apan kopyahon ang string niini gamit ang string function diin ang null byte mao ang string terminator. Busa, ang string gikopya lamang hangtod sa null byte; ang nahabilin sa buffer adunay wala pa ma-initialize nga datos. Makita dinhi ang detalyadong pag-analisa. .
Ehemplo sa konpigurasyon (^@ null byte)
location ~ /memleak { rewrite ^.*$ "^@asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdasdf"; } location / { root html; index index.html index.htm; }epekto
curl localhost:8337/secret -vv
...
curl localhost:8337/memleak -vv
...
Location: http://localhost:8337/secret
...
- Ang Nginx nanalipod sa mga parameter sa GET gikan sa character injection ug nagtugot lamang sa mga parameter sa GET nga magamit sa pagsulat pag-usab. Busa, ang pag-inject pinaagi sa mga parameter nga kontrolado sa tiggamit dili mahimo sa Nginx. Bisan pa, ang mga parameter sa POST dili protektado. Gisuportahan sa OpenResty ang mga parameter sa GET ug POST, busa ang paggamit sa mga parameter sa POST pinaagi sa OpenResty nagmugna sa posibilidad sa special character injection.
Ehemplo sa pag-configure:
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; }resulta:
curl localhost:8337 -d "url=secret" -vv
...
curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
...
Location: http://localhost:8337/{...может содержать secret...}
...
Dugang nga reaksyon
Ang problema gitaho na sa mga developer sa nginx ug OpenResty, wala giisip sa mga developer ang problema isip usa ka sayop sa seguridad sa nginx, tungod kay sa nginx mismo walay posibilidad nga mapahimuslan ang sayop pinaagi sa pag-inject og mga espesyal nga karakter, ayuhon gipatik niadtong Disyembre 16. Sulod sa 4 ka bulan sukad sa report, ang OpenResty wala’y gihimo nga bisan unsang mga pagbag-o, bisan kung nasabtan nga kinahanglan ang usa ka luwas nga bersyon sa function nga ngx.req.set_uri(). Niadtong Marso 18, 2020, among gipatik ang impormasyon, ug niadtong Marso 21, gipagawas sa OpenResty , nga nagdugang sa pagsusi sa URI.
Portswigger maayong artikulo ug mikuha og mga komento gikan sa OpenResty ug Nginx (bisan tuod ang komento nga gamay ra nga tipik sa memorya ang gibutyag dili sakto ug makapahisalaag, kini gitino sa gitas-on sa string nga nagsunod sa null byte ug, sa kawalay klaro nga mga limitasyon sa gitas-on, mahimong makontrol sa usa ka tig-atake).
Busa unsa ang sayop ug unsa ang mahimo aron malikayan kini?
Naa bay bug sa nginx? Oo, naa gyud, kay ang memory leak usa man gihapon ka sayop.
Naa bay mga bug sa OpenResty? Oo, labing menos, ang seguridad sa gimbuhaton nga gitanyag sa OpenResty wala pa masusi ug madokumento.
Naa bay sayop sa pag-configure/paggamit sa OpenResty? Oo, tungod kay sa kawalay klaro nga giya, usa ka wala mapamatud-i nga pangagpas ang gihimo bahin sa seguridad sa gigamit nga gamit.
Hain niining mga bug ang usa ka $10000 nga bounty security vulnerability? Para namo, dili kini importante. Sa bisan unsang software, labi na kung daghang mga component ang nagtagbo, labi na kadtong gihatag sa lainlaing mga proyekto ug mga developer, walay makagarantiya nga ang tanan nga mga detalye sa ilang operasyon nahibal-an ug nadokumento, ug nga walay mga sayup. Busa, ang bisan unsang kahuyangan sa seguridad motumaw kung diin kini makaapekto sa seguridad.
Sa bisan unsang kaso, maayong praktis ang pag-normalize o paglimite/pagsala kutob sa mahimo sa input data nga moadto sa bisan unsang external module/API gawas kung adunay klaro nga mga instruksyon ug klaro nga pagsabot nga dili kini kinahanglan.
Sayop
Gikan sa kasinatian , alang sa pagpreserbar sa kaputli sa pinulongan:
ganti sa insekto - kompetisyon sa pagpangita og insekto
report sa bug — pahibalo sa sayop
ibalhin pag-usab - pag-redirect
bukas nga tinubdan - bukas nga tinubdan
sayop - pagtrabaho sa mga sayop
Source: www.habr.com
