AWS - Lambda Layers Persistence
Lambda Layers
Lambdaレイヤーは、追加のコードやその他のコンテンツを含むことができる.zipファイルアーカイブです。レイヤーには、ライブラリ、カスタムランタイム、データ、または構成ファイルを含めることができます。
1つの関数に最大5つのレイヤーを含めることができます。関数にレイヤーを含めると、内容は実行環境の/opt
ディレクトリに展開されます。
デフォルトでは、作成したレイヤーはAWSアカウントにプライベートです。他のアカウントとレイヤーを共有するか、レイヤーを公開するかを選択できます。異なるアカウントが公開したレイヤーを関数が消費する場合、関数は削除された後もレイヤーバージョンを使用したり、レイヤーへのアクセス許可が取り消された後も使用できます。ただし、削除されたレイヤーバージョンを使用して新しい関数を作成したり、関数を更新することはできません。
コンテナイメージとして展開された関数はレイヤーを使用しません。代わりに、イメージをビルドする際に好みのランタイム、ライブラリ、およびその他の依存関係をコンテナイメージにパッケージ化します。
Pythonのロードパス
LambdaでPythonが使用するロードパスは次のとおりです:
第二と三番目の位置が、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)に送信しますが、他の技術も統合できます。
外部レイヤー
外部アカウントからLambdaレイヤーを使用することが可能です。さらに、Lambdaは権限を持っていなくても外部アカウントからレイヤーを使用できます。 また、Lambdaが持つことができるレイヤーの最大数は5であることに注意してください。
したがって、この技術の柔軟性を向上させるために、攻撃者は次のことができます:
ユーザーの既存のレイヤーにバックドアを仕込む(何も外部ではない)
自身のアカウントでレイヤーを作成し、被害者アカウントにアクセス権限を与えてレイヤーを使用するように設定し、被害者のLambdaでレイヤーを構成し、権限を削除します。
Lambdaは引き続きレイヤーを使用でき、被害者は(Lambda内でrevシェルを取得する以外に)**レイヤーのコードを簡単にダウンロードする方法を持たなくなります。
被害者は**
aws lambda list-layers
を使用して外部レイヤーを見ることはできません**。
Last updated