クリックジャッキングの防止

OWASP Zap は、今回のウェブアプリケーションが Clickjacking Attack の影響を受けやすいことを特定しました。Clickjacking の目的は、ユーザーが知覚するものとは異なるものをクリックするようにユーザーを騙すことです。これにより、攻撃者はユーザーが知らないうちに不要なアクション(攻撃者のアカウントへの送金)を行うよう誘導します。

問題を修正するため、すべてのレスポンスに X-Frame-Options レスポンスヘッダーを SAMEORIGIN に設定して追加します。これは、ブラウザに、あなたのページを異なるドメインの他のウェブサイトに埋め込むことができないことを示します。

X-Frame-Options ヘッダーは実際には Content-Security-Policy を支持して設計されています。しかし、この記事の執筆時点では、OWASP Zap は CSP ヘッダーが適切に設定されていてもアラームを設定しています。

  1. flask-app フォルダで、app.py を編集し、コードを次のように置き換えます。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    
    import os
    from flask import Flask
    
    from pages import (
        index,
        about,
        a1,
        a2,
        a3,
        a5,
        a6,
        a7,
        a9
    )
    
    import models
    from flask_wtf.csrf import CSRFProtect
    
    ### Initialize App
    app = Flask(__name__)
    app.url_map.strict_slashes = False
    
    ### Enable CSRF
    app.config['SECRET_KEY'] = os.urandom(32)
    csrf = CSRFProtect()
    csrf.init_app(app)
    
    
    ### Register blueprints
    app.register_blueprint(index.bp)
    app.register_blueprint(about.bp, url_prefix="/about")
    app.register_blueprint(a1.bp, url_prefix="/owasp")
    app.register_blueprint(a2.bp, url_prefix="/owasp")
    app.register_blueprint(a3.bp, url_prefix="/owasp")
    app.register_blueprint(a5.bp, url_prefix="/owasp")
    app.register_blueprint(a6.bp, url_prefix="/owasp")
    app.register_blueprint(a7.bp, url_prefix="/owasp")
    app.register_blueprint(a9.bp, url_prefix="/owasp")
    
    ### Configure database
    app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///user.db"
    models.db.init_app(app)
    models.db.app = app
    models.bootstrap()
    
    ### Add Security Headers
    @app.after_request
    def add_security_headers(r):
        r.headers['X-Frame-Options'] = 'SAMEORIGIN'
        return r

  2. 先ほど追加した強調表示されたコード行は、Flaskアプリケーションがすべてのレスポンスに X-Frame-Options ヘッダーを追加するように強制します。app.py を保存し、Cloud9 Terminal ウィンドウに次のコマンドを入力して、これらの変更を Publish します。

    cd ~/environment/flask-app
    git commit -a -m"Add Security Headers"
    git push
    
  3. これにより、パイプラインが自動的にトリガーされます。AWS CodePipeline に移動し、進行状況を見てください。すべてが順調であれば、DAST ステップは成功するはずです。 dast-success

おめでとう! セキュリティツールが自動的に特定されたセキュリティ問題を解決しました。次のモジュールでは、パイプラインで検出されなかった残りのセキュリティ問題について説明します。