AWS - Lambda Layers Persistence
Шари Lambda
Шар Lambda - це .zip-архів, який може містити додатковий код або інший вміст. Шар може містити бібліотеки, власний рантайм, дані або файли конфігурації.
Можливо включити до п'яти шарів на функцію. Коли ви включаєте шар у функцію, вміст розпаковується в каталог /opt
в середовищі виконання.
За замовчуванням, шари, які ви створюєте, приватні для вашого облікового запису AWS. Ви можете вибрати поділитися шаром з іншими обліковими записами або зробити шар публічним. Якщо ваші функції використовують шар, який опублікував інший обліковий запис, ваші функції можуть продовжувати використовувати версію шару після його видалення або після скасування вашого дозволу на доступ до шару. Однак ви не можете створити нову функцію або оновити функції, використовуючи видалену версію шару.
Функції, розгорнуті як зображення контейнера, не використовують шари. Замість цього ви упаковуєте ваш вибраний рантайм, бібліотеки та інші залежності в зображення контейнера під час побудови зображення.
Шлях завантаження Python
Шлях завантаження, який використовуватиме Python в lambda, є наступним:
Перевірте, як друга та третя позиції зайняті каталогами, де розпаковуються файли lambda layers: /opt/python/lib/python3.9/site-packages
та /opt/python
Якщо зловмисник зміг вставити задній прохід в використаний шар lambda або додати один, який буде виконувати довільний код при завантаженні загальної бібліотеки, він зможе виконати шкідливий код при кожному виклику lambda.
Отже, вимоги такі:
Перевірте бібліотеки, які завантажуються кодом жертви
Створіть проксі-бібліотеку з шарами lambda, яка буде виконувати власний код та завантажувати оригінальну бібліотеку.
Попередньо завантажені бібліотеки
Під час зловживання цією технікою я зіткнувся з труднощами: Деякі бібліотеки вже завантажені в час виконання python, коли ваш код виконується. Я очікував знайти такі речі, як os
або sys
, але навіть бібліотека json
була завантажена.
Для зловживання цією технікою постійності, код повинен завантажити нову бібліотеку, яка не завантажується під час виконання коду.
З кодом python, подібним до цього, можна отримати список бібліотек, які попередньо завантажені в середовищі виконання python в lambda:
І ось це список (перевірте, що бібліотеки, такі як os
або json
, вже там)
Це список бібліотек, які lambda включає встановленими за замовчуванням: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Підставлення в Lambda Layer
У цьому прикладі давайте припустимо, що цільовий код імпортує csv
. Ми будемо підставляти імпорт бібліотеки csv
.
Для цього ми створимо каталог csv з файлом __init__.py
в ньому за шляхом, який завантажується lambda: /opt/python/lib/python3.9/site-packages
Потім, коли lambda виконується і намагається завантажити csv, наш файл __init__.py
буде завантажений і виконаний.
Цей файл повинен:
Виконати нашу вразливість
Завантажити оригінальну бібліотеку csv
Ми можемо це зробити за допомогою:
Потім створіть zip-архів з цим кодом за шляхом python/lib/python3.9/site-packages/__init__.py
та додайте його як шар лямбди.
Ви можете знайти цей код за посиланням https://github.com/carlospolop/LambdaLayerBackdoor
Інтегрований вразливий код надсилатиме IAM-повноваження на сервер ПЕРШИЙ РАЗ, коли його викликають або ПІСЛЯ скидання контейнера лямбди (зміна коду або холодна лямбда), але інші техніки, такі як наступні, також можуть бути інтегровані:
pageAWS - Steal Lambda RequestsЗовнішні шари
Зверніть увагу, що можна використовувати шари лямбди з зовнішніх облікових записів. Більше того, лямбда може використовувати шар з зовнішнього облікового запису навіть якщо у нього немає дозволів. Також зверніть увагу, що максимальна кількість шарів, яку може мати лямбда, - 5.
Отже, для покращення універсальності цієї техніки зловмисник може:
Вразити існуючий шар користувача (нічого зовнішнього)
Створити шар у своєму обліковому записі, надати користувачеві доступ до використання шару, налаштувати шар в лямбді жертви та видалити дозвіл.
Лямбда все ще зможе використовувати шар, а жертва не матиме простого способу завантажити код шарів (окрім отримання оберненого шелу всередині лямбди)
Жертва не побачить зовнішні шари, використані з
aws lambda list-layers
Last updated