Repository navigation
fix: cegah false positive polyglot scan pada PNG/gambar biner - #3
Merged
Merged
Conversation
Alternatif <?= dan <? polos di FileContentValidator::POLYGLOT_PATTERN hanya 2-3 byte literal, cocok secara kebetulan pada data terkompresi gambar raster asli (terutama PNG/foto berentropi tinggi) sehingga unggahan gambar sah ditolak sebagai "wrong extension" (OpenSID/premium#6987 - komentar review). Kedua alternatif sekarang mensyaratkan rentetan byte mirip kode sungguhan tepat setelah penanda, terverifikasi 0 false positive dari 3000 PNG bernoise vs ~13% sebelumnya, tanpa melemahkan deteksi payload PHP/HTML yang sungguhan disisipkan. Turut memperbaiki pesan galat max_size_reached yang memakai placeholder gaya sprintf (%d) yang tidak pernah disubstitusi trans(), sehingga pengguna melihat teks mentah alih-alih ukuran batas sebenarnya.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Deskripsi
Memperbaiki dua bug yang dilaporkan pada
OpenSID/premium#6987(review komentar https://github.com/OpenSID/premium/pull/6987#issuecomment-5630635765): unggahan PNG ditolak dengan "Wrong extension" secara tidak konsisten, dan pesan galat batas ukuran menampilkan placeholder mentah%d.1. False positive pada polyglot scan (root cause "PNG gak bisa upload")
FileContentValidator::POLYGLOT_PATTERNmemindai seluruh isi berkas untuk menangkap PHP/HTML yang disisipkan. Dua alternatifnya —<?polos dan<?=— hanya 2-3 byte literal, yang ternyata cocok secara kebetulan pada data biner terkompresi milik gambar raster asli (PNG/JPEG/WebP), terutama gambar berentropi tinggi seperti foto atau hasil AI image generator.Diverifikasi dengan 3000 PNG bernoise nyata (dibuat via GD, bukan payload buatan): pola lama menolak ~13% di antaranya sebagai false positive; setelah perbaikan, 0/3000.
Perbaikan: kedua alternatif sekarang mensyaratkan rentetan byte yang tampak seperti kode sungguhan tepat setelah penanda (
MIN_CODE_RUN_AFTER_SHORT_TAG = 10byte printable/whitespace berturut-turut) — payload PHP asli selalu punya ini, data biner acak nyaris tidak pernah.Seluruh test keamanan yang ada tetap lolos (webshell disamarkan sebagai .jpg, HTML smuggling, bare short tag yang disisipkan ke gambar asli, dll).
2. Pesan galat max_size_reached menampilkan
%dmentahUploadControllermemanggiltrans('filemanager::filemanager.max_size_reached')tanpa parameter, padahal string lang-nya memakai placeholder gayasprintf(%d) yang tidak pernah disubstitusi olehtrans()Laravel — sehingga pengguna melihat teks literal "...maximale size of %d MB." alih-alih angka yang sebenarnya.Perbaikan: string lang memakai placeholder
:sizeala Laravel, dan controller mengirim nilaimax_upload_sizeyang terkonfigurasi lewatFilemanagerConfig::maxUploadSizeMb()(baru).Test
accepts_real_noisy_pngs_without_false_positives(20 iterasi PNG bernoise nyata) diFileContentValidatorTest.reports_the_actual_size_limit_when_a_file_is_too_largediUploadRouteTest.vendor/bin/phpunit: 91 tests, 210 assertions, OK.vendor/bin/pint --test: passed.vendor/bin/phpstan analyse: No errors.Checklist