Шкідливі пул-реквести
Виправлення справжнє. Файл, якого воно ще торкається, — не частина цього виправлення.
Що таке Шкідливі пул-реквести?
Шкідливий пул-реквест атакує рев'ю, а не код. Зміна невелика, опис корисний, а одна правка ховається у файлі, якого опис ніде не згадує. Ви самі подасте такий пул-реквест: справжнє виправлення нестабільного тесту плюс прихований у скрипті розгортання рядок, що надсилає всі змінні CI на сервер, який ви контролюєте. Далі ви переглянете його вже як мейнтейнерка й прочитаєте кожен змінений файл замість того, щоб довіряти опису. Нарешті ви закріпите це виявлення в правилах проєкту: CODEOWNERS, обов'язкове рев'ю від власників коду та обмеження на те, що можуть запускати пул-реквести з форків.
Що ви дізнаєтесь у Шкідливі пул-реквести
- Розпізнавайте тривожну ознаку шкідливого пул-реквесту: правку у файлі, не пов'язаному із заявленою метою зміни, яка ховається серед звичайних фрагментів diff
- Усвідомлюйте, чому недостатньо прочитати опис пул-реквесту і чому рев'юер мусить відкрити та прочитати повний diff кожного зміненого файлу
- Сприймайте правки не за темою у скриптах розгортання, збірки чи CI як сигнал до уважнішого, скептичнішого рев'ю
- Застосовуйте посилення політики рев'ю: CODEOWNERS для чутливих файлів, обов'язкове схвалення від більш ніж одного рев'юера та обмеження на те, що можуть запускати пул-реквести з форків
- Усвідомлюйте, чому пул-реквести з форків перебувають за межею довіри проєкту й потребують особливої прискіпливості, доки їхньому коду не почнуть довіряти
Шкідливі пул-реквести — Кроки навчання
-
Оцініть проєкт
Сьогодні Боб націлюється на Fennroot — проєкт із відкритим кодом, що створює інструменти для розробників і приймає пул-реквести від будь-кого. Він починає там, де почав би будь-який контриб'ютор: у публічному репозиторії Harrow, інструмента збірки проєкту. Відкритий проєкт — це відчинені двері: будь-хто може зробити форк, змінити код і відкрити пул-реквест. Боб прийшов не допомагати. Йому потрібно, щоб його код злили, а єдина перешкода — рев'ю зайнятого мейнтейнера.
-
Форк і клонування
Боб створює форк репозиторію у власному обліковому записі та клонує форк локально, щоб унести зміни й надіслати їх назад як пул-реквест. Його план простий: додати одну справді корисну зміну як прикриття, а поруч сховати другу, не пов'язану з першою.
-
Прикриття й ціль
Прикриття в Боба справжнє: він виправляє справді нестабільний тест повторних спроб, а такий невеликий внесок проєкт радо приймає. Ця зміна чесна й корисна, і в цьому вся суть: вона робить пул-реквест схожим на рутинний. Але насправді Боб націлився на зовсім інший файл. Він відкриває скрипт розгортання, який не пов'язаний із жодним тестом, і читає його ще без змін.
-
Підкиньте бекдор
Боб додає в скрипт розгортання один рядок. Цей рядок схожий на безневинний фрагмент телеметрії збірки, але надсилає всі змінні середовища на сервер, який контролює Боб. Скрипт розгортання виконується в CI проєкту, де серед цих змінних є ключі розгортання й токени реєстру. Один рядок у файлі, якого пул-реквест ніде не згадує. Це і є вся атака.
-
Сховано на видноті
Цей рядок читається як те, що міг би додати інженер зі збірки, і стоїть серед звичайних кроків розгортання. Ніщо в ньому не віщує атаку, і саме тому він лишається непоміченим, коли код лише побіжно проглядають.
-
Закомітьте обидві зміни
Боб додає обидві правки до індексу й комітить їх разом: справжнє виправлення тесту та рядок у скрипті розгортання — в одному коміті. У такій зв'язці шкідлива зміна потрапляє в проєкт услід за чесною.
-
Надішліть зміни у форк
Боб надсилає гілку у свій форк. Це надсилання потрапляє до його власної копії репозиторію, а платформа у відповідь показує посилання, щоб відкрити пул-реквест до репозиторію Fennroot.
-
Відкрийте пул-реквест
Боб відкриває пул-реквест до репозиторію Fennroot. Він пише заголовок і опис, у яких ідеться лише про нестабільний тест і немає жодного слова про скрипт розгортання. Виправлення тесту — це історія, яку Боб хоче, щоб рев'юер прочитав. Бекдор у ній не згадано зовсім.
-
Підштовхніть до злиття
Коли пул-реквест відкрито, Боб додає дружній коментар, у якому квапить зі злиттям. Він залишає цей коментар біля рядка з тестом, щоб погляд рев'юера впав саме туди, а не на скрипт розгортання. Невеликий соціальний тиск: схвалити швидко, поки ніхто не вчитався.
-
Перевірка знань
Охоплення стандартів безпеки
CWE
- CWE-494 Download of Code Without Integrity Check
- CWE-345 Insufficient Verification of Data Authenticity
MITRE ATT&CK
- T1195.002 Supply Chain Compromise: Compromise Software Supply Chain
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security