Хук cors є детермінованим рушієм спеціалізації http-request, і ви можете запускати його самі. Він працює у двох режимах однієї команди: scan, що перевіряє вихідний код на allowlist джерел, який можна обійти (регулярний вираз для перевірки хоста, повз який прослизає хост зловмисника), і score, що оцінює окреме значення джерела CORS як wildcard, null або safe.
Перевірка кодової бази
Без прапорців хук перевіряє весь проєкт.
- Увесь проєкт
- Каталог
- Один файл
npx lagune read cors
npx lagune read cors --dir src/server
npx lagune read cors --file internal/auth/origin.go
Він виводить кожен allowlist, який можна обійти, під одним заголовком, згрупувавши за файлами. Валідатор хоста, у якого .+/.* стоїть у сегменті authority перед суфіксом довіреного хоста (^https?://.+\.trusted\.com), пропускає хост зловмисника на кшталт your-site.com.attacker.com.
Origin-allowlist patterns with a greedy wildcard (bypassable, review):
internal/auth/origin.go
^https?://.+\.trusted\.com
Це привід для перегляду, а не закрита знахідка: чи керує регулярний вираз реальним рішенням про довіру, неможливо визначити з тексту, тож перевірка ніколи не змінює код виходу. Перегляньте кожен і переконайтеся, що allowlist порівнює за повною рівністю. Якщо нічого не знайдено, хук виводить один рядок.
npx lagune read cors --dir src/clean
# => no bypassable origin allowlist found
Оцінка джерела
Передайте кожне джерело через --origin. Хук виводить по одному слову на джерело й завершується з ненульовим кодом за будь-якого wildcard чи null.
- Одне джерело
- Кілька джерел
npx lagune read cors --origin '*' # => wildcard
npx lagune read cors --origin 'null' # => null
npx lagune read cors --origin 'https://app.example.com' # => safe
Повторіть --origin, щоб оцінити весь allowlist одним викликом, по вердикту на рядок, у тому самому порядку.
npx lagune read cors \
--origin 'https://app.example.com' \
--origin '*' \
--origin 'null'
# => safe
# => wildcard
# => null
| Вердикт | Значення |
|---|---|
safe | Не *, не null і не glob із *. Це не гарантує, що джерело правильно сформоване. |
wildcard | * або glob піддомену, хоста чи порту: будь-який сайт (або широке їх коло) може читати відповідь. |
null | Джерело null, яке можуть підробити iframe у пісочниці й перенаправлення. |
Дозволом є лише safe, а --origin є оракулом значень: він оцінює значення, а не обробник, тож перевірте обробник за допомогою спеціалізації http-request.
Параметри CLI
| Параметр | Значення | Опис |
|---|---|---|
--origin | джерело | Оцінити одне значення джерела. Повторіть, щоб оцінити кілька, по одному на рядок. |
--dir | каталог | Обмежити перевірку каталогом. Повторюється й поєднується з --file. |
--file | файл | Обмежити перевірку одним файлом. Повторюється й поєднується з --dir. |
Без параметрів хук перевіряє весь проєкт. --origin вмикає режим score і не поєднується з --dir чи --file.
Перевірка розпізнає форму регулярного виразу, який можна обійти, а --origin оцінює значення джерел. Два шаблони на рівні вихідного коду залишаються поза її межами: віддзеркалення Origin запиту (сервер повертає вхідний Origin назад або поєднує його з обліковими даними) і надто вільний allowlist на основі endsWith чи підрядка. Розпізнайте їх у коді й діяйте так, як описує спеціалізація http-request.
Часті запитання
Iframe у пісочниці й деякі перенаправлення надсилають Origin: null, тож allowlist, що довіряє null, дає цим контекстам доступ на читання. Хук cors позначає його разом із wildcard.
Виконайте npx lagune read cors над кодовою базою. Він позначає регулярний вираз для перевірки хоста, у якого жадібний wildcard стоїть перед довіреним суфіксом, тож хост зловмисника на кшталт your-site.com.attacker.com прослизає повз нього.
