CYBER INSIGHT 2019「ハッキングデモからサイバー脅威を理解する。パート1」では意図しないLambda Functionを実行することができるコードインジェクションについて解説いたしまいた。

今回はパート2と言うことでサーバレスの環境の脆弱性でOWASP TOPの「認証の不備」と「アクセス制御の不備」に関連する内容でご紹介いたします。

デモではCognito [認証サービス]で発行されるトークンを改ざんすることで別のユーザーに成り済まして、そのユーザーがアクセスできるリソースにアクセスできてします事例をみます。

 

今回のシナリオはTest1ユーザーでログインし、Test2の情報にトークンを改ざんすることでTest2ユーザーの認証なしでアクセスができることを確認します。

上のスライドはCognitoの認証で使われるトークンでJson Web Tokenになります。このトークンを改ざんすることでLambdaで制御しているパラメータを改ざんし、意図しない動作が行われてしまいます。今回は別のユーザーになりすましてアクセスできるようになります。

 

JWT(Json Web Token)はAuthorizationヘッダーで送信されることが多く、(プログラムによっては別のヘッダー名で送信されることもある。)上のスライドのように赤部分、緑部分、青部分の3つに分けることができます。これらのパートは.(ピリオド)で区切られており、分解することができます。

JWTの各パートは赤の部分はヘッダー、緑の部分はペイロード、青の部分は署名として更新され、ペイロードにはアプリケーションと受け渡しするパラメータが含まれます。データはBASE64でエンコードされていますので、デコードをすることで平文で表示され各パートの中身を確認することができます。

 

上のスライドではペイロード部分をデコードしています。このアプリケーションではclient_idやusernameなどが送信されていて、アプリケーション内でこの値が参照され、コンテンツの表示が制御されていることが考えられます。

今回はリクエストをこの赤枠のusernameの値を変更して、POSTすることで変更後のユーザーに参照することができます。

上の例ははじめにtest1@xxxxのUUIDで注文リストを表示させるプログラムになっております。そのプログラムはトークン内のusernameから注文リストを参照していますので、別のユーザーのUUIDに変更するとそのユーザーの注文リストが参照できることが想定されます。スライド内の例ではtest2@xxxxのUUIDに変更した結果、そのユーザーの注文リストが出力されたことを表してます。

この攻撃では他のユーザーのUUIDがわかっている前提の例ですが、XSSなど脆弱性がありCookieからユーザー情報が抜き取れるような場合や、プログラムがUUIDではなくメールアドレスで制御されている場合は簡単にこの脆弱性を突くことができます。

この脆弱性の根本的な対策は、JWT(Json Web Token)が改ざんを検知することで、認証時に発行したトークンが改ざんされた場合には出力しないで、エラー出力するロジックが必要になります。

https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt

上記のリンクはCognitoで発行されたトークンをCognitoの公開鍵を取得して検証するpythonのサンプルコードになります。このような検証ロジックを組み込むことがアプリケーション内では重要になりますので、APIエンドポイントを提供しているアプリケーションでTokenで制御を行っている場合、このような脆弱性の有無を是非確認してください。

サイバーマトリックスのウェブ脆弱性診断でも検査いたします。よろしくお願いいたします!