AWS - Lambda Layers Persistence
Шари Lambda
Шар Lambda - це архів .zip, який може містити додатковий код або інший вміст. Шар може містити бібліотеки, власний рантайм, дані або файли конфігурації.
Можливо включити до п'яти шарів на функцію. Коли ви включаєте шар у функцію, вміст розпаковується в каталог /opt
в середовищі виконання.
За замовчуванням, шари, які ви створюєте, приватні для вашого облікового запису AWS. Ви можете вибрати поділитися шаром з іншими обліковими записами або зробити шар публічним. Якщо ваші функції використовують шар, який опублікував інший обліковий запис, ваші функції можуть продовжувати використовувати версію шару після його видалення або після скасування вашого дозволу на доступ до шару. Однак ви не можете створити нову функцію або оновити функції, використовуючи видалену версію шару.
Функції, розгорнуті як зображення контейнера, не використовують шари. Замість цього ви упаковуєте ваш вибраний рантайм, бібліотеки та інші залежності в зображення контейнера під час його побудови.
Шлях завантаження Python
Шлях завантаження, який Python використовуватиме в лямбді, наступний:
Перевірте, як друга та третя позиції зайняті каталогами, де шари lambda розпаковують свої файли: /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-повноваження на сервер ПЕРШИЙ РАЗ, коли його викликають або ПІСЛЯ скидання контейнера лямбди (зміна коду або холодна лямбда), але інші техніки, такі як наступні, також можуть бути інтегровані:
AWS - Steal Lambda RequestsЗовнішні шари
Зверніть увагу, що можна використовувати шари лямбди з зовнішніх облікових записів. Більше того, лямбда може використовувати шар з зовнішнього облікового запису навіть якщо у нього немає дозволів. Також зверніть увагу, що максимальна кількість шарів, яку може мати лямбда, - 5.
Отже, для поліпшення універсальності цієї техніки зловмисник може:
Додати вразливість до існуючого шару користувача (нічого не є зовнішнім)
Створити шар у своєму обліковому записі, надати обліковому запису жертви доступ до використання шару, налаштувати шар в лямбді жертви та видалити дозвіл.
Лямбда все ще зможе використовувати шар, а жертва не матиме простого способу завантажити код шарів (окрім отримання оберненого шелу всередині лямбди)
Жертва не побачить зовнішні шари, використані з
aws lambda list-layers
Last updated