Slide 1

Slide 1 text

サーバーレスは 安全なのか? Hacking AWS Lambda

Slide 2

Slide 2 text

自己紹介 •氏名:廣山 豊 •所属:アイレット株式会社 クラウドインテグレーション事業部副事業部長 兼 内部統制推進室室長 •役割:情報管理責任者 兼 PCI DSS管理責任者 兼 AWS Well Architected Lead 兼 品質管理責任者 •AWS Top Engineers - 2019 ~ <初回から継続中> •AWS, 情報処理安全確保支援士、 その他多数の認定資格を保有

Slide 3

Slide 3 text

はじめに

Slide 4

Slide 4 text

このLambdaファンクションで、他の人のデータを盗める? import json
 import yaml
 
 def Handler(event, context): 
 data = yaml.load(event[“body”]["Data"]) 
 store_data(data)
 
 return {
 "statusCode" : 200, 
 "body" : “OK!!”
 }
 import json
 import yaml
 
 def Handler(event, context): 
 data = yaml.load(event[“body”]["Data"]) 
 # store_data(data)
 
 return {
 "statusCode" : 200, 
 "body" : “OK!!”
 }


Slide 5

Slide 5 text

注意事項 https://unit42.paloaltonetworks.com/gaining-persistency-vulnerable-lambdas/ 攻撃手段については、上記で公開されている範囲内でお話しします。 悪用への活用や、無断での第三者環境での試用は絶対にしないでください!

Slide 6

Slide 6 text

ハッキング

Slide 7

Slide 7 text

AWS Lambda の仕組み 以下の3点が、今回のお話の肝となります。 ● コールドスタート時に、コンテナが生成される ● bootstrap (ランタイム)はユーザーが記載するコード(ハンドラ)と同じコンテナ環境に存在する ● ランタイム はハンドラの呼び出しとレスポンスの返却をループ処理で繰り返す 引用) https://aws.amazon.com/jp/blogs/compute/the-serverless-lamp-stack-part-3-replacing-the-web-server/ https://medium.com/build-succeeded/deconstructing-aws-lambda-functions-d1597dd054cd

Slide 8

Slide 8 text

今回解説するハッキングの概要 ハンドラから bootstrap を差し替えることで実現。 
 OS コマンドインジェクションの脆弱性をつく。 データを盗み出すよう改竄した bootstrap を送り込み、YAML読み込み時にプロセスを 差し替えることで永続化させる。 この bootstrap は、ハンドラ呼び出し直前に、TCPにてデータを指定のIPアドレス宛に 送信する。

Slide 9

Slide 9 text

ハッキング構成 差し替える

Slide 10

Slide 10 text

bootstrap の改ざん手順 ざっくりとした手順は以下。 1. 正規の bootstrap をベースに加工した bootstrap を用意する 2. 加工した bootstrap を、既存の bootstrap と差し替えるスクリプトを用意する 3. 攻撃対象の Lambda に対し、1, 2 のスクリプトを展開させるような YAML データを 付属の上、呼び出す 正規の bootstrap の振る舞いも続けるため、利用者および Lambda の保守担当者は 気づきにくい。 成功すれば、そのコンテナ環境に次回以降くるリクエストに付随するデータを搾取可能。

Slide 11

Slide 11 text

加工した bootstrap のサンプルの抜粋 ハンドラ呼び出しの直前に POST で悪意ある 攻撃者宛にデータを送信

Slide 12

Slide 12 text

プロセスを差し替えるスクリプトのサンプル

Slide 13

Slide 13 text

Lambdaに送りつける YAML データ生成のサンプル 先の2つのサンプルを差し込んで、上記の偽装 YAML を生成し、Lambda ファンクション を invoke する。

Slide 14

Slide 14 text

盗み出したデータのキャプチャ Base64でデコードすることで データを取得可能

Slide 15

Slide 15 text

ホワイトハッカー視点での分析

Slide 16

Slide 16 text

攻撃に対して PyYAML の脆弱性 (CVE-2017-18342) をついた、OS コマンドインジェクション。 5.1 未満のバージョンに存在。 CVSS で 9.8 のヤバいやつ。 引用) https://nvd.nist.gov/vuln/detail/CVE-2017-18342

Slide 17

Slide 17 text

問題となる箇所 PyYaml ver 5.1 で作った Layer

Slide 18

Slide 18 text

問題箇所のコード import json
 import yaml
 
 def Handler(event, context): 
 data = yaml.load(event[“body”]["Data"]) 
 # store_data(data)
 
 return {
 "statusCode" : 200, 
 "body" : “OK!!”
 }


Slide 19

Slide 19 text

防御 Shift Left(スキャン、ネットワーク制限、暗号化) Shield Right(WAF、エージェント、VPC FlowLog、GuardDuty) 引用) https://sysdig.com/blog/cnapp-runtime-insights-shift-left-shield-right/

Slide 20

Slide 20 text

防御 Shift Left も重要! 予めできることはやっておきましょう!

Slide 21

Slide 21 text

Amazon CodeGuru の検出例 しっかり検出!

Slide 22

Slide 22 text

AWS WAF防御例 「os.execv」 という文字列を検知 左記のルールを設定した WAFをAPI Gatewayにアタッチ した上で攻撃を行なったログ

Slide 23

Slide 23 text

AWS Lambda における責任共有モデル IaaSとサーバーレス 引用) https://docs.aws.amazon.com/whitepapers/latest/security-overview-aws-lambda/the-shared-responsibility-model.html

Slide 24

Slide 24 text

AWS Lambda における責任共有モデル IaaSとサーバーレス

Slide 25

Slide 25 text

Wrap-up

Slide 26

Slide 26 text

AWS Lambdaは危険なのか? No! OS コマンドインジェクションは、IaaS やオンプレでも有効。むしろ攻撃を成功させやす い。 コールドスタートによって自動的にコンテナを再生成(攻撃を無効化)できる AWS Lamba の方が安全。

Slide 27

Slide 27 text

まとめ ● (IaaS やオンプレよりは攻撃難易度は上がるものの) たとえ FaaS であっても脆弱性対策は必要 ● セキュリティ面を考慮するには、仕組みを知ったほうがいい ● 脆弱性をなくすことと(Shift Left)、攻撃を検知・防御すること(Shield Right)両面で 行う