e16d4454ce
Продолжение исправлений по security-аудиту. M1 (MEDIUM) — установщик PHP-ретранслятора был открыт без входа: до создания админа атакующий из интернета мог завести админа кабинета или подменить адрес ядра/ключ. Добавлен «код установки»: генерируется в файл install.lock рядом с данными (вне веб-корня), прочитать его можно только с доступом к файловой системе (FTP/файловый менеджер) — то есть владельцу сервера. Шаги connect и admin (включая «пропустить») требуют верный код. Регексп loopback заякорен (`http://127.0.0.1.attacker.com` больше не проходит как loopback). Код удаляется по завершении установки. Проверено встроенным php-сервером. M3 (MEDIUM) — распаковка 7z в мастере ключа (ExtractISO) сохраняла пути из архива → запись «../…» вышла бы за каталог. Перед распаковкой архив просматривается (7z l -slt, без записи); при абсолютном пути или выходе за корень распаковка отклоняется. Тест TestUnsafeArchivePath. L1 — target_device не проверялся перед root mount: значение не из списка съёмных теперь отклоняется (иначе root смонтировал бы произвольный девайс). L5 — likeEscape в ручном поиске DEPO (manualDepoSearch): метасимволы LIKE от пользователя больше не «расползаются» по базе. L2a — кука сессии ядра получает Secure и за TLS-терминирующим прокси на loopback (reqIsHTTPS учитывает X-Forwarded-Proto только от loopback). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
26 lines
780 B
Go
26 lines
780 B
Go
package lkgateway
|
|
|
|
import "testing"
|
|
|
|
// M3: пути с выходом за корень или абсолютные должны отклоняться перед 7z x.
|
|
func TestUnsafeArchivePath(t *testing.T) {
|
|
unsafe := []string{
|
|
"../evil.txt", "../../etc/passwd", "a/../../b", "/etc/passwd",
|
|
`\windows\system32`, "C:/Windows/x", `dir\..\..\x`, "..",
|
|
}
|
|
for _, p := range unsafe {
|
|
if !unsafeArchivePath(p) {
|
|
t.Errorf("должен быть отклонён: %q", p)
|
|
}
|
|
}
|
|
safe := []string{
|
|
"boot/grub/grub.cfg", "isolinux/isolinux.bin", "a/b/c.txt",
|
|
"file.iso", "dir/sub/..file", "a..b/c", "x.tar",
|
|
}
|
|
for _, p := range safe {
|
|
if unsafeArchivePath(p) {
|
|
t.Errorf("ложное срабатывание на безопасном пути: %q", p)
|
|
}
|
|
}
|
|
}
|