AWS - Abusing Lambda Extensions
Lambda Extensions
Lambda extensionsは、さまざまな監視、可観測性、セキュリティ、およびガバナンスツールと統合することで関数を強化します。これらの拡張機能は、.zipアーカイブを使用してLambdaレイヤー経由で追加されるか、コンテナイメージのデプロイメントに含まれることで、内部および外部の2つのモードで動作します。
内部拡張機能は、言語固有の環境変数およびラッパースクリプトを使用して起動を操作し、ランタイムプロセスと統合します。このカスタマイズは、Java Correto 8および11、Node.js 10および12、.NET Core 3.1などのさまざまなランタイムに適用されます。
外部拡張機能は、別個のプロセスとして実行され、Lambda関数のライフサイクルと整合性を保ちながら動作します。これらは、Node.js 10および12、Python 3.7および3.8、Ruby 2.5および2.7、Java Corretto 8および11、.NET Core 3.1、およびカスタムランタイムと互換性があります。
lambda extensionsの動作についての詳細はこちらのドキュメントを参照してください。
External Extension for Persistence, Stealing Requests & modifying Requests
これは、この投稿で提案された技術の概要です: https://www.clearvector.com/blog/lambda-spy/
Lambdaランタイム環境のデフォルトのLinuxカーネルが「process_vm_readv」および「process_vm_writev」システムコールでコンパイルされていることが判明しました。そして、すべてのプロセスは同じユーザーIDで実行され、外部拡張機能のために作成された新しいプロセスも同様です。これは、外部拡張機能が設計上、Rapidのヒープメモリに完全な読み取りおよび書き込みアクセスを持つことを意味します。
さらに、Lambda拡張機能は呼び出しイベントにサブスクライブする機能を持っていますが、AWSはこれらの拡張機能に生データを公開しません。これにより、拡張機能がHTTPリクエストを介して送信される機密情報にアクセスできないようにしています。
Init (Rapid)プロセスは、http://127.0.0.1:9001でのすべてのAPIリクエストを監視し、Lambda拡張機能は、ランタイムコードの実行前に初期化および実行されますが、Rapidの後に行われます。
変数 AWS_LAMBDA_RUNTIME_API
は、子ランタイムプロセスおよび追加の拡張機能に対して、Rapid APIのIPアドレスおよびポート番号を示します。
AWS_LAMBDA_RUNTIME_API
環境変数をアクセス可能な**port
に変更することで、Lambdaランタイム内のすべてのアクションを傍受することが可能です(man-in-the-middle)。これは、拡張機能がRapid Initと同じ権限で実行され、システムのカーネルがプロセスメモリの変更**を許可しているため、ポート番号の変更が可能になるためです。
拡張機能はランタイムコードの前に実行されるため、環境変数を変更すると、ランタイムプロセス(例:Python、Java、Node、Ruby)の起動時に影響を与えます。さらに、私たちの拡張機能の後に読み込まれる拡張機能もこの変数に依存しているため、私たちの拡張機能を経由することになります。この設定により、マルウェアがランタイム環境内でセキュリティ対策やログ拡張機能を完全に回避することが可能になります。
ツール lambda-spy は、そのメモリ書き込みを実行し、lambdaリクエスト、他の拡張機能のリクエストから機密情報を盗み、さらにはそれらを変更するために作成されました。
References
Last updated