ec-chapter security

mobsfscanとGithub Actionsによるモバイルアプリの継続的セキュリティチェック

ec-chapter security

こんにちは、EC事業部事業領域拡大チーム所属のTatsumi0000です!業務ではAndroidアプリ開発をメインに、時々iOSアプリの開発をしています。

EC事業部では、Chapterという活動をしています。Chapterとは、事業部内のチームを横断した組織で、フロントエンド、バックエンド、セキュリティなど、様々なChapterが存在しています(詳細については、後述します)。その中でも私はセキュリティChapterに参加し、Chapterのメンバーと一緒にいろいろな活動をしてきました。

この記事では、EC事業部で行っているChapterと、セキュリティChapterの活動の一環として、mobsfscanをgithub.comのGitHub Actionsで試した話について紹介します。

  1. EC事業部のChapterとは
  2. mobsfscanをGitHub Actionsで試した
  3. おわりに

EC事業部のChapterとは

EC事業部にはChapterという枠組みが存在します。これはSpotifyモデルを参考にした組織構造ですが、少しだけアレンジが加えてあります。 Spotifyモデルには、Guildという興味のある人が集まって情報共有を目的としている枠組みと、Chapterという業務上の専門領域における課題に対してチームを横断して解決することを目的としている枠組みが存在しています。 EC事業部のChapterはSpotifyモデルのChapterと異なり、SpotifyモデルにおけるGuild・Chapter両方の役割を果たすことを期待されています。 SpotifyモデルにおけるGuildとしての情報共有を目的とした活動をメインにしつつ、業務上の専門領域における課題に対してチームを横断して解決できるとなお良いという位置づけになっています。

現在、EC事業部内には以下のChapterがあります。

  • エンジニアリングマネジメント
  • バックエンド
  • フロントエンド
  • セキュリティ
  • IoT・XR

mobsfscanをGitHub Actionsで試した

セキュリティChapterでは、普段の業務におけるセキュリティ周りの悩みや、その悩みを解決するに当たって調べたことを話しています。他にも、話し合いの内容をもとに開発もしています。ここからは、今まで行ってきた活動の中から、GitHub Actions上でmobsfscanという静的解析ツールを試した話を紹介します。

セキュリティChapterの活動で、GMO ペパボ株式会社 23卒・24卒向け セキュリティ勉強会 実践 DevSecOps パイプライン を読む機会があり、その中でSAST(Static Application Security Testing)という言葉が出てきました。

SASTとは、アプリケーションに対して静的解析を行い、脆弱性がないか確認するテスト手法のことです。この資料の中で紹介されていたSASTツールはすべてWebアプリケーション開発向けのツール群だったため、私が普段開発を行っているモバイル(Android・iOS)アプリケーション向けのSASTツールがないのか調査をしました。

その結果、mobsfscan というものがあることが分かりました。mobsfscanのREADMEによると、AndroidとiOSのソースコードから安全でないコードパターンを見つける事ができる静的解析ツールとのことでした。

さらにmobsfscanは、静的解析した結果をSARIF(Static Analysis Results Interchange Format)として出力することができます。SARIFとは、静的解析ツールの結果を共有するために定められたフォーマットの名前です。

今回は、GitHub Actions上でmobsfscanを使ってコードの静的解析を行いSARIFとして出力します。さらに、その出力したSARIFをGitHubにアップロードすることで、脆弱性が検出された場合にはリポジトリのSecurityタブにアラートと表示させることができることを検証しました。検証に使ったコードは、こちらのリポジトリになります。

今回はサンプルアプリとしてMobSF-iOSを作りました。このアプリのコードにはパスワードをハードコーディングしています。このハードコーディングしたパスワードを検出出来るか試してみます。

import SwiftUI

struct ContentView: View {
    /// わざとパスワードをハードコーディングしてみる
    let password = "strong password"

    var body: some View {
        Text("Hello, world!")
            .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    
    static var previews: some View {
        ContentView()
    }
}

GitHub Actionsのワークフローファイルは以下のように設定しています。今回は学習のために敢えて、mobsfscanのActionと、SARIFをアップロードするActionを使わずに動かしています。mobsfscanはpipでインストールし、mobsfscanコマンドを使って実行します。SARIFはGitHubのWebAPIに対してcurlコマンドを使ってアップロードします。


name: mobsfscan ios
on:
  push:
    paths:
      - 'MobSF-iOS/**'

# GITHUB_TOKENの権限を設定できる
permissions:
  security-events: write

jobs:
  mobsfscan:
    runs-on: ubuntu-latest
    name: mobsfscan code scanning
    steps:
    - uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with: 
          python-version: "3.7"
          architecture: "x64"

    - name: Set up MobSF
      run: |
        pip3 install --upgrade mobsfscan
    
    - name: Run mobsfscan
      run: |
        mobsfscan MobSF-iOS --sarif --output results.sarif || true

    - name: gzip
      id: gzip
      run: |
        SARIF=$(gzip -c results.sarif | base64 -w0)
        echo "::set-output name=SARIF::$SARIF"
    # https://docs.github.com/ja/rest/code-scanning#upload-an-analysis-as-sarif-data
    - name: Upload mobsfscan report
      run: |
        curl -i -X POST \
          -H "Accept: application/vnd.github.v3+json" \
          -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
          -d '{"commit_sha": "${{ github.sha }}", "ref": "${{ github.ref }}", "sarif": "${{ steps.gzip.outputs.SARIF }}"}' \
          https://api.github.com/repos/Tatsumi0000/MobSF-Practice/code-scanning/sarifs

  1. permissionsで、SARIFファイルをアップロードするために使うPOST /repos/:owner/:repo/code-scanning/sarifsに必要な権限をGITHUB_TOKENに付与するために設定します
  2. Run mobsfscanステップでは、mobsfscanコマンドで今回のためのサンプルアプリとして作ったMobSF-iOSアプリを解析し、解析結果を、results.sarifファイルに出力します。
  3. gzipステップでは、SARIFをGitHubにアップロードするためには、gzip形式に圧縮し、base64形式の文字列としてエンコードする必要があるため圧縮します
  4. Upload mobsfscan reportステップでは、curlコマンドでGitHubにアップロードします。APIにアクセスするために必要なパラメータはこちらを参照しています。

GitHub Actionsが動いたあとに、SARIFをアップロードしたリポジトリ(今回だとTatsumi0000/MobSF-Practiceリポジトリ)「Security」→「Code scanning alerts」にアラートが出ました。

GitHub Securityにアラートを出しているスクショ

おわりに

GitHub Securityにアラートを出す以外にも、Pull requestの段階で脆弱性の検出をしてreviewdogなどを使ってコメントを残すといったこともしたいと思いました。

セキュリティChapterではさまざまなことに取り組んでいます。今後もペパボのサービスを使ってくださるユーザー様に安心していただくためにも、セキュリティの知識をつけていきたいと思います。

今後セキュリティ以外のChapterの活動に関する記事も公開していく予定です。