Ngeunaan hiji kerentanan dina ...

Ngeunaan hiji kerentanan dina ...

Sataun ka tukang, 21 Maret 2019, di program bounty bug Mail.Ru hiji pohara alus datang ka HackerOne laporan bug от maxarr. Nalika ngenalkeun bait nol (ASCII 0) kana parameter POST tina salah sahiji pamundut API wéb anu ngabalikeun alihan HTTP, potongan mémori anu teu diinisialisasi katingali dina data alihan, dimana fragmen tina parameter GET sareng lulugu tina pamundut sanés ka server sarua.

Ieu kerentanan kritis sabab ... requests ogé ngandung cookies sési. Sababaraha jam saatosna, perbaikan samentawis dilakukeun anu nyaring nol bait (sakumaha tétéla engké, ieu henteu cekap, sabab masih aya kamungkinan nyuntik CRLF / ASCII 13, 10, anu ngamungkinkeun anjeun pikeun ngamanipulasi header sareng data tina respon HTTP, ieu kirang kritis, tapi masih pikaresepeun). Dina waktos anu sami, masalahna ditransferkeun ka analis kaamanan sareng pamekar pikeun milarian sareng ngaleungitkeun panyabab bug.

Mail.ru mail mangrupikeun aplikasi anu rumit pisan; sajumlah ageung komponén hareup-tungtung/tukang-tungtung anu béda, boh open source (seueur hatur nuhun ka sadaya pamekar parangkat lunak gratis) sareng anu dikembangkeun sacara internal, tiasa kalibet dina ngahasilkeun réspon. Kami junun ngaluarkeun sadaya komponén iwal nginx sareng openresty sareng ngalokalkeun masalah sateuacan nelepon ngx.req.set_uri() dina Aksara OpenResty nu teu kalakuanana saperti nu diharapkeun (nyelapkeun bait null atawa feed garis via parameter GET kalawan nulis balik di ngx_http_rewrite_module, nu, nurutkeun dokuméntasi, dipaké sarta, éta bakal sigana, kudu dianggo dina cara nu sarua, bakal teu dianggo). Konsékuansi anu mungkin dileungitkeun, saringan ditambah sakumaha ketat-gancang, sareng saringan diverifikasi pikeun ngaleungitkeun sadaya vektor anu mungkin. Tapi mékanisme anu nyababkeun bocorna eusi mémori tetep misterius. Sabulan ti harita, laporan bug ditutup sakumaha direngsekeun, sareng analisa panyababna bug ditunda dugi ka waktos anu langkung saé.

OpenResty mangrupikeun plugin anu kasohor pisan anu ngamungkinkeun anjeun nyerat skrip Lua di jero nginx, sareng dianggo dina sababaraha proyék Mail.ru, janten masalahna henteu dianggap direngsekeun. Sareng saatos sababaraha waktos, aranjeunna tungtungna balik deui pikeun ngartos alesan anu leres, kamungkinan akibat sareng ngadamel saran pikeun pamekar. Ilubiung dina penggalian kode sumber Denis Denisov и Nikolay Ermiskin. Tétéla éta:

  • Dina nginx, nalika nganggo nulis balik sareng data pangguna, aya kamungkinan traversal diréktori (sareng sigana SSRF) dina sababaraha konfigurasi, tapi ieu mangrupikeun kanyataan anu dipikanyaho sareng kedah dideteksi ku analisa konfigurasi statik dina Nginx Amplify и gixy ti Yandex (enya, kami nganggo éta ogé, hatur nuhun). Nalika nganggo OpenResty, fitur ieu gampang dileungitkeun, tapi ieu henteu mangaruhan konfigurasi kami.

    conto konfigurasi:

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

    hasil

    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 gaduh bug anu nyababkeun mémori bocor upami garis tulis ulang ngandung bait null. Nalika alihan dikaluarkeun, nginx allocates panyangga memori anyar pakait jeung panjang pinuh garis, tapi nyalin garis aya ngaliwatan fungsi garis nu nol bait mangrupakeun terminator garis, jadi garis ieu disalin ngan nepi ka nol. bait; sesa panyangga ngandung data uninitialized. A analisis lengkep bisa kapanggih di dieu.

    conto konfigurasi (^@ nol bait)

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

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

  • Nginx ngajagi parameter GET tina suntikan karakter jasa sareng ngamungkinkeun anjeun ngan ukur nganggo parameter GET dina nulis ulang. Ku alatan éta, teu mungkin pikeun ngamangpaatkeun suntik ngaliwatan parameter-dikawasa pamaké di nginx. Parameter POST teu ditangtayungan. OpenResty ngamungkinkeun anjeun damel sareng parameter GET sareng POST, janten nalika nganggo parameter POST ngalangkungan OpenResty, anjeun tiasa nyuntik karakter khusus.

    conto konfigurasi:

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

    hasilna:

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

Réaksi salajengna

Masalahna dilaporkeun ka pamekar nginx sareng OpenResty, pamekar henteu nganggap masalah éta salaku bug kaamanan dina nginx, sabab dina nginx sorangan teu aya deui jalan pikeun ngamangpaatkeun kasalahan ngaliwatan suntikan karakter husus, ngalereskeun panyingkepan memori diterbitkeun dina 16 Désémber. Dina 4 bulan saprak laporan, euweuh parobahan geus dijieun pikeun OpenResty, sanajan aya hiji pamahaman yén versi aman tina fungsi ngx.req.set_uri () diperlukeun. Dina 18 Maret 2020 kami nyebarkeun inpormasi, dina 21 Maret dileupaskeun OpenResty Vérsi 1.15.8.3, nu nambihan validasi URI.

Portswigger kuring nulis artikel anu saé sareng nyandak koméntar ti OpenResty sareng Nginx (sanaos koméntar anu ngan ukur sapotong mémori anu kakeunaan henteu leres sareng nyasabkeun, ieu ditangtukeun ku panjang garis nuturkeun bait null sareng, dina henteuna larangan eksplisit dina éta. panjangna, bisa dikawasa ku panyerang).

Janten naon kasalahanana sareng naon anu tiasa dilakukeun pikeun nyegahna?

Naha aya bug dina nginx? Leres, éta, sabab eusi mémori bocor mangrupikeun kasalahan dina sagala hal.

Naha aya bug dina OpenResty? Leres, sahenteuna masalah kaamanan fungsionalitas anu ditawarkeun ku OpenResty teu acan ditalungtik sareng didokumentasikeun.

Naha aya kasalahan konfigurasi / pamakean sareng OpenResty? Leres, sabab dina henteuna pernyataan eksplisit, asumsi anu teu diverifikasi dilakukeun ngeunaan kaamanan fungsionalitas anu dianggo.

Anu mana tina bug ieu mangrupikeun kerentanan kaamanan kalayan hadiah $ 10000? Pikeun urang, ieu umumna teu penting. Dina parangkat lunak naon waé, khususna di simpang sababaraha komponén, khususna anu disayogikeun ku proyék sareng pamekar anu béda, teu aya anu tiasa ngajamin yén sadaya fitur karyana dipikanyaho sareng didokumentasikeun sareng teu aya kasalahan. Ku alatan éta, sagala kerentanan kaamanan lumangsung persis dimana mangaruhan kaamanan.

Dina sagala hal, éta prakték alus normalize atawa ngawatesan / nyaring saloba mungkin data input nu mana kana sagala modul éksternal / API, iwal aya parentah eksplisit sarta pamahaman jelas yén ieu teu diperlukeun.

Érté

Tina pangalaman artikel saméméhna, demi ngajaga kamurnian basa:

bug bounty - kompetisi moro bug
laporan bug - bewara kasalahan
alihan - alihan
open source - open source
erratum - dianggo dina kasalahan

sumber: www.habr.com

Tambahkeun komentar