Apa batas PCRE?

11

Di ModSecurity ada PCRE limits exceededkesalahan.

Saya tahu saya bisa memperbaikinya dengan menetapkan aturan seperti:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

Tapi, apa sebenarnya aturan-aturan ini? Apa yang dimaksud dengan rekursi batas PCRE diatur ke 150.000 artinya? Lubang keamanan apa yang saya izinkan dengan mengatur ini begitu tinggi? Apa recursiondan apa limitartinya?

Saya tahu ada dokumentasi, tetapi dokumentasi itu tidak benar-benar memberi tahu saya apa yang sedang terjadi, itu hanya memberi tahu saya bagaimana bekerja dengan arahan.

Andy Lester
sumber
Saya mengedit posting ini untuk mengubah tag "perl" menjadi "pcre". PCRE bukan Perl, terlepas dari apa akronim yang Anda yakini.
Andy Lester

Jawaban:

13

Ini tampaknya merupakan pengaturan internal mesin PCRE untuk membatasi jumlah maksimum memori / waktu yang dihabiskan untuk mencoba mencocokkan beberapa teks dengan suatu pola. Halaman pcreapi manual tidak banyak menjelaskannya dalam istilah awam:

Bidang match_limit menyediakan cara untuk mencegah PCRE menggunakan sumber daya dalam jumlah besar saat menjalankan pola yang tidak akan cocok, tetapi memiliki sejumlah besar kemungkinan di pohon pencarian mereka. Contoh klasik adalah penggunaan pengulangan tak terbatas bersarang.

Secara internal, PCRE menggunakan fungsi yang disebut kecocokan () yang dipanggil berulang kali (kadang secara rekursif). Batas yang ditetapkan oleh match_limit dikenakan pada berapa kali fungsi ini dipanggil selama pertandingan, yang memiliki efek membatasi jumlah backtracking yang dapat terjadi. Untuk pola yang tidak berlabuh, hitungan dimulai kembali dari nol untuk setiap posisi dalam string subjek.

Nilai default untuk batas dapat ditetapkan ketika PCRE dibangun; default default adalah 10 juta, yang menangani semua kecuali kasus yang paling ekstrim. Anda dapat mengganti default dengan memasok pcre_exec () dengan blok pcre_extra di mana match_limit diatur, dan PCRE_EXTRA_MATCH_LIMIT diatur di bidang bendera. Jika batas terlampaui, pcre_exec () mengembalikan PCRE_ERROR_MATCHLIMIT.

Bidang match_limit_recursion mirip dengan match_limit, tetapi alih-alih membatasi jumlah total waktu yang cocok () dipanggil, bidang ini membatasi kedalaman rekursi. Kedalaman rekursi adalah jumlah yang lebih kecil dari jumlah total panggilan, karena tidak semua panggilan yang cocok () bersifat rekursif. Batas ini hanya digunakan jika ditetapkan lebih kecil dari match_limit.

Karena pustaka bawaan PCRE adalah 10000000, tebakan saya adalah bahwa pengaturan yang lebih rendah disarankan untuk mod_security untuk mencegah permintaan ditahan untuk waktu yang lama.

DerfK
sumber
modsecurity tampaknya memiliki nilai default 1500 , yang secara signifikan lebih rendah dari 1M. Nilai OP 150000 kemudian akan meningkatkan pengaturan, bukan menguranginya.
Paul Mougel