# 2021年度 選択コース Bトラック(プロダクトセキュリティトラック)応募課題 以下、共通問題 **1問** に加え、選択問題の中から **2問以上** を選び、回答してください。 ## 共通問題(回答必須) 今年のセキュリティ・キャンプ全国大会で受講したい講義は何ですか?その講義でどのようなことを学びたいですか?また、何故それを学びたいのですか?(複数可) ## 選択問題(2問以上を選択) ### 選択問題A AWSなどのクラウドサービスでは、認証情報が漏洩することにより、それに紐づく権限を悪用される恐れがあります。たとえば、ストレージに格納された個人情報の流出により信用が失われる場合や、アカウントの不正利用により多額の請求が来るなどの被害を被る可能性があります。 以下の構成図は、あるショッピングサイトのAWSインフラ構成図です。この環境には、リバースプロキシ(Nginx)とWebアプリケーションが動作するEC2インスタンスに加え、データを格納するためのRDSとS3が存在しています。このクラウドシステムについて、小問(1)(2)に回答してください。 ![構成図](https://seccamp2021-b-cloud-124e9ddff3b17c8692e9d94c83e09a4f5a038a8d.s3-ap-northeast-1.amazonaws.com/Seccamp2021_B_Cloud.png "構成図") * [ec2-role-policy.json](https://seccamp2021-b-cloud-124e9ddff3b17c8692e9d94c83e09a4f5a038a8d.s3-ap-northeast-1.amazonaws.com/ec2-role-policy.json) * [s3-bucket-polocy.json](https://seccamp2021-b-cloud-124e9ddff3b17c8692e9d94c83e09a4f5a038a8d.s3-ap-northeast-1.amazonaws.com/s3-bucket-polocy.json) * [nginx.conf](https://seccamp2021-b-cloud-124e9ddff3b17c8692e9d94c83e09a4f5a038a8d.s3-ap-northeast-1.amazonaws.com/nginx.conf) **小問(1)** このショッピングサイトのAWS構成図において、どのような攻撃やリスクが起こりうるかをあなたのわかる範囲で記述してください(必須回答) **小問(2)** 想定した攻撃やリスクに対して、[AWS Well-Architected Framework](https://wa.aws.amazon.com/wellarchitected/2020-07-02T19-33-23/wat.pillar.security.ja.html) の観点を交えて、あなたの考えた対策案を記述してください。図などを使っても構いません(必須回答) -- ### 選択問題B Webアプリケーションの認証・認可について、以下の小問(1)(2)(3)に回答してください。小問(4)の回答は任意とします。 **小問(1)** Google、Facebook、Instagram、Twitter、GitHub、LINE等の任意のサービスにおけるソーシャルログインを実際に試し、感じたことやセキュリティ上の課題について自由に回答してください(必須回答) **小問(2)** OpenID ConnectやOAuthのように標準化された認証・認可技術を使うことのメリットとデメリットを回答してください(必須回答) **小問(3)** 実社会で動作する認証・認可を取り扱うシステムにおいて、ソフトウェア以外の面で重要だと思う要素を一つ以上挙げてください。システムを扱う人間、システムを取り囲む事象などできるだけ広い視野で考えてみてください(必須回答) **小問(4)** 任意のサービスのソーシャルログインの実装を行い、その環境(ライブラリやフレームワーク、開発言語など)の説明と、開発してみて感じたことを自由に回答してください(任意回答) -- ### 選択問題C Webブラウザが実装する様々なJavaScript APIは、WebIDLというインタフェース定義言語で外部仕様が記述されています。 たとえば、[window](https://developer.mozilla.org/ja/docs/Web/API/Window)オブジェクトのインターフェイスは以下のURLにWebIDLが定義されています。 ``` https://html.spec.whatwg.org/#the-window-object ``` オープンソースのWebブラウザであるChromiumのコードベースには、WebIDLの定義ファイルが以下のURLのように含まれており、JavaScriptエンジン(V8)とのバインディングの自動生成などに用いられています。 ``` https://source.chromium.org/chromium/chromium/src/+/master:third_party/blink/renderer/core/frame/window.idl ``` このWebIDLに関して、次の小問(1)(2)に答えてください。小問(3)(4)の回答は任意とします。 **小問(1)** JavaScriptの [document](https://developer.mozilla.org/ja/docs/Web/API/Document)オブジェクトは、[HTML Living Standard](https://html.spec.whatwg.org/)の`Document`というインターフェイスに定義されています。`Document`のWebIDL定義をHTML Living Standardから探し出し、その定義が含まれる項のURLを答えてください(必須回答) ``` (回答例) https://html.spec.whatwg.org/#abstract ``` **小問(2)** Chromiumのソースツリーから `Document` インターフェイスのWebIDLファイル(拡張子は`.idl`)を探し出し、[Chromium Code Search](https://source.chromium.org/chromium/chromium/src)上のURLで答えてください(必須回答) ``` (回答例)https://source.chromium.org/chromium/chromium/src/+/master:省略/省略.idl ``` **小問(3)** Chromiumのソースツリーでは、WebIDLファイルの近くに、そのインターフェイスの実装が存在します。小問(2)で見つけた `Document` インターフェイスを実装したソースコード(拡張子は`.h`, `.cpp`)を探し出し、そのファイルを示す Chromium Code Search 上の URL を答えてください。また、そのソースコードの中から、Webブラウザ上のJavaScriptで `document.domain` に対して代入処理を行なった際に呼び出される関数を特定し、その内部処理を簡潔に説明してください(任意回答) **小問(4)** 小問(1)で見つけた`Document`のWebIDLと、小問(2)で探し出した定義ファイルには差分があります。この差分は何に由来するものかを簡潔に説明してください(任意回答) -- ### 選択問題D DNSに関して、以下の小問(1)(2)に回答してください。(3)の回答は任意とします。 **小問(1)** drillまたはdigコマンドを用いて、DNSのルートゾーンから www.nic.ad.jp. のゾーンを辿り、以下を回答してください(必須回答) * ルートサーバをどのように見つけたか * ネームサーバを辿っていく際に調べたこと・考えたことを自分の言葉で記述してください **小問(2)** DNSの仕組みを用いることで、ユーザがWebブラウザで www.nic.ad.jp にアクセスしているにも関わらず、本来とは異なるサーバにアクセスさせることが可能となります。それを可能とする方法をできる範囲で挙げて、簡単に説明してください(必須回答) **小問(3)** Encrypted DNS (DoH、DoT)が普及することのメリット・デメリットを簡単に説明してください。性能・不審な通信の検出・ローカルで使う名前空間の他、思いつく現在からの変化を説明してください(任意回答) -- ### 選択問題E Pythonにはpickleという標準モジュールがあります。[pickleの公式ドキュメント](https://docs.python.org/ja/3/library/pickle.html)に記載されているように、pickleで信頼できない値をデシリアライズすることは脆弱性の原因となり得ます。その理由および攻撃手法について、以下の小問(1)(2)に回答してください。 **小問(1)** 何故、脆弱性となるのかを説明してください(必須回答) **小問(2)** 以下のPythonのソースコードには上記の脆弱性が存在します。この脆弱性を用いて、TCPの1234番ポートに対するリバースシェルを作成してください。netcatで1234番ポートを待ち受けておき、接続が確立した後、lsなどのコマンドを打ち込み結果が返ってくれば正解です。リバースシェルを確立させることのできるBase64文字列と、この文字列を生成するPoC(実証コード)の両方を提出してください(必須回答) ``` #!/usr/bin/env python3 import sys import base64 import pickle args = sys.argv if len(args) != 2: print('第一引数にBase64エンコードされた文字列を指定してください') try: data = base64.urlsafe_b64decode(args[1]) deserialized = pickle.loads(data) print('deserialized: {0}'.format(deserialized)) except: print('Failed to deserialize') ``` -- ### 選択問題F セキュリティは幅広い分野から成り立っていますが、その中で自分がもっとも興味があるテーマについて、興味を持ったきっかけと、興味を持って実際に行った取り組みを好きなだけ述べてください。