AWS - Lambda Layers Persistence
Lambda Layers
Lambdaレイヤーは、追加のコードやその他のコンテンツを含む.zipファイルアーカイブです。レイヤーにはライブラリ、カスタムランタイム、データ、または構成ファイルを含めることができます。
1つの関数に最大5つのレイヤーを含めることができます。関数にレイヤーを含めると、内容は実行環境の/opt
ディレクトリに展開されます。
デフォルトでは、作成したレイヤーはAWSアカウントにプライベートです。他のアカウントとレイヤーを共有するか、レイヤーを公開するかを選択できます。異なるアカウントが公開したレイヤーを関数が消費する場合、関数は削除された後もレイヤーバージョンを使用し続けることができます、またはレイヤーへのアクセス許可が取り消された後も使用できます。ただし、削除されたレイヤーバージョンを使用して新しい関数を作成したり、関数を更新したりすることはできません。
コンテナイメージとして展開された関数はレイヤーを使用しません。代わりに、イメージをビルドする際に好みのランタイム、ライブラリ、およびその他の依存関係をコンテナイメージにパッケージ化します。
Pythonのロードパス
PythonがLambdaで使用するロードパスは次のとおりです:
第二と三番目の位置が、lambda layersがファイルを展開するディレクトリによって占有されているかを確認します:/opt/python/lib/python3.9/site-packages
と /opt/python
攻撃者が使用されているlambda layerにバックドアを仕掛けたり、実行される任意のコードを追加したりすることに成功した場合、共通ライブラリがロードされるたびに悪意のあるコードを実行できるようになります。
したがって、要件は次のとおりです:
被害者のコードによってロードされるライブラリを確認する
lambda layersを使用したプロキシライブラリを作成し、カスタムコードを実行して元のライブラリをロードする。
事前にロードされたライブラリ
このテクニックを悪用する際に困難に直面しました:Pythonランタイムでコードが実行されるときにはすでにいくつかのライブラリがロードされていました。os
やsys
のようなものを見つけることを期待していましたが、json
ライブラリさえもロードされていました。
この持続性テクニックを悪用するためには、コードが実行されるときにロードされていない新しいライブラリをロードする必要があります。
このようなPythonコードを使用すると、lambda内のPythonランタイムで事前にロードされたライブラリのリストを取得できます:
そして、これがリストです(os
やjson
などのライブラリがすでにあるかどうかを確認してください)
以下は、lambdaにデフォルトでインストールされているライブラリのリストです: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Lambda Layer Backdooring
この例では、対象のコードが**csv
をインポートしていると仮定します。csv
ライブラリのインポートにバックドアを仕掛けます**。
そのために、lambdaによってロードされるパスに、ファイル**__init__.py
を含むディレクトリcsvを作成します: /opt/python/lib/python3.9/site-packages
その後、lambdaが実行され、csvをロードしようとすると、__init__.py
ファイルがロードおよび実行**されます。
このファイルは次のようにする必要があります:
ペイロードを実行する
元のcsvライブラリをロードする
次のように両方を行うことができます:
その後、このコードを**python/lib/python3.9/site-packages/__init__.py
**のパスに含むzipファイルを作成し、Lambda レイヤーとして追加します。
このコードはhttps://github.com/carlospolop/LambdaLayerBackdoor で見つけることができます。
統合されたペイロードは、最初に呼び出されるとIAMクレデンシャルをサーバーに送信するか、Lambdaコンテナがリセットされた後(コードの変更またはコールドLambda)に送信しますが、他の技術も統合できます:
pageAWS - Steal Lambda Requests外部レイヤー
外部アカウントからLambda レイヤーを使用することが可能です。さらに、Lambda は権限を持っていなくても外部アカウントからレイヤーを使用できます。 また、Lambda が持つことができるレイヤーの最大数は5です。
したがって、この技術の柔軟性を向上させるために、攻撃者は次のことができます:
ユーザーの既存のレイヤーにバックドアを仕込む(何も外部ではない)
自身のアカウントで レイヤーを作成し、被害者アカウントにアクセス権限を与え、被害者のLambdaでレイヤーを構成し、権限を削除します。
Lambda は引き続きレイヤーを使用でき、被害者は(Lambda内でリバースシェルを取得する以外に)**レイヤーのコードを簡単にダウンロードする方法を持たなくなります。
被害者は**
aws lambda list-layers
で使用されている外部レイヤーを見ることができません**
最終更新