Масове присвоєння
Два зайві ключі JSON — і баланс ви задаєте самі.
Що таке Масове присвоєння?
API копіює кожне поле з тіла запиту на внутрішній об'єкт, не маючи переліку полів, які може задавати той, хто викликає. Токен чесний, а запис належить тому, хто викликає. Бракує заходу захисту на рівні полів. Ви надішлете звичайне оновлення профілю, а потім те саме оновлення з двома зайвими ключами JSON, і сервер запише обидва. Виправлення читає лише ті поля, які редагування профілю має змінювати. Перевірка власника чи перевірка ролі не закриють прогалину на рівні полів.
Що ви дізнаєтесь у Масове присвоєння
- Розпізнавайте масове присвоєння: API прив'язує кожне поле з тіла запиту до збереженого об'єкта, тож той, хто викликає, може задати поля, які ніколи не мав контролювати, додавши їх до запиту
- Відрізняйте його від порушеної авторизації на рівні об'єктів (доступ до об'єкта, що вам не належить) та від підвищення привілеїв через підроблений токен (втручання у власні облікові дані); тут токен чесний, а об'єкт справді належить тому, хто викликає, і бракує заходу захисту на рівні полів
- Зрозумійте, як допустиме редагування власного запису стає шахрайством, коли обробник записує надіслані в запиті поля, які мав би задавати лише внутрішній процес, наприклад баланс балів чи рівень облікового запису
- Застосовуйте виправлення: замініть сліпу прив'язку всього тіла явним списком дозволених полів, які може записувати операція, і ігноруйте кожен інший ключ
- Зрозумійте, чому список дозволених кращий за список заборонених і чому виправлений ендпоінт відповідає 200, відкидаючи поля, які не можна записувати, а також перевіряйте кожен обробник створення й оновлення на таку саму сліпу прив'язку
Масове присвоєння — Кроки навчання
-
Звичайний учасник
Perklane — роздрібний застосунок винагород: учасники заробляють бали за покупки й обмінюють їх у застосунку на подарункові картки. Боб зареєструвався як звичайний учасник під вигаданим ім'ям, щоб перевірити, як далеко може зайти звичайний обліковий запис. Його обліковий запис нічим не особливий: це звичайний учасник з токеном, що дає змогу читати й редагувати власний профіль. Боб відкриває консоль розробника, щоб побачити, що йому дає API облікових записів.
-
Один об'єкт, два види полів
На картці профілю Боба видно поля, які застосунок дозволяє йому редагувати, а поруч — значення, які застосунок зберігає про нього. У довіднику API показано, як застосунок читає й зберігає цей профіль.
-
Прочитайте власний профіль Боба
Спершу Боб звертається до ендпоінта так, як це задумано: просить API видати його власний профіль, передаючи свій токен учасника в заголовку Authorization — точно так, як це робить застосунок.
-
Його профіль, усі поля
Сервер повертає саме те, що має: власний профіль Боба, бо Боб звернувся по власний запис із власним токеном. Тут усе гаразд. Але структура запису заслуговує на уважний погляд.
-
Зробіть звичайне редагування
Спершу Боб користується функцією за призначенням: звичайним редагуванням профілю. Він перемикає запит на метод збереження й надсилає нове відображуване ім'я та аватар — два поля, які насправді пропонує форма профілю.
-
Зміна зберігається
Збереження вдалося. Відображуване ім'я та аватар змінилися, а решта лишилася без змін.
-
Подивіться на зміну в його профілі
Перш ніж іти далі, Боб робить те, що зробив би будь-який учасник після збереження: перезавантажує сторінку свого облікового запису. Сторінка читає назад усе, що збереження внесло до його запису.
-
Додайте поля, яких форма ніколи не показує
Той самий запит, той самий токен, той самий ендпоінт. Боб лишає в тілі відображуване ім'я та аватар і додає ще два ключі — точні назви полів, які йому видав запит на читання: баланс балів і рівень. Якщо збереження об'єднує все, що отримує, воно запише й ці поля.
-
Баланс, якого він не заробляв
Сервер прийняв усе. У власному профілі Боба тепер пів мільйона балів і рівень Platinum, а встановили їх лише два зайвих ключі в редагуванні профілю.
-
Подивіться на результат у його профілі
API відповів 200, але Боб хоче побачити результат так, як побачив би будь-який учасник. Він перезавантажує консоль власного облікового запису: сторінка прочитає назад усе, що збереження внесло до його запису.
Охоплення стандартів безпеки
OWASP API Top 10
- API6:2019 Mass Assignment
CWE
- CWE-915 Improperly Controlled Modification of Dynamically-Determined Object Attributes
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