こんにちは、EC事業部事業領域拡大チーム所属のTatsumi0000です!業務ではAndroidアプリ開発をメインに、時々iOSアプリの開発をしています。
EC事業部では、Chapterという活動をしています。Chapterとは、事業部内のチームを横断した組織で、フロントエンド、バックエンド、セキュリティなど、様々なChapterが存在しています(詳細については、後述します)。その中でも私はセキュリティChapterに参加し、Chapterのメンバーと一緒にいろいろな活動をしてきました。
この記事では、EC事業部で行っているChapterと、セキュリティChapterの活動の一環として、mobsfscanをgithub.comのGitHub Actionsで試した話について紹介します。
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
permissions
で、SARIFファイルをアップロードするために使うPOST /repos/:owner/:repo/code-scanning/sarifs
に必要な権限をGITHUB_TOKENに付与するために設定します。Run mobsfscan
ステップでは、mobsfscanコマンドで今回のためのサンプルアプリとして作ったMobSF-iOSアプリを解析し、解析結果を、results.sarifファイルに出力します。gzip
ステップでは、SARIFをGitHubにアップロードするためには、gzip形式に圧縮し、base64形式の文字列としてエンコードする必要があるため圧縮します。Upload mobsfscan report
ステップでは、curlコマンドでGitHubにアップロードします。APIにアクセスするために必要なパラメータはこちらを参照しています。
GitHub Actionsが動いたあとに、SARIFをアップロードしたリポジトリ(今回だとTatsumi0000/MobSF-Practiceリポジトリ)「Security」→「Code scanning alerts」にアラートが出ました。
おわりに
GitHub Securityにアラートを出す以外にも、Pull requestの段階で脆弱性の検出をしてreviewdogなどを使ってコメントを残すといったこともしたいと思いました。
セキュリティChapterではさまざまなことに取り組んでいます。今後もペパボのサービスを使ってくださるユーザー様に安心していただくためにも、セキュリティの知識をつけていきたいと思います。
今後セキュリティ以外のChapterの活動に関する記事も公開していく予定です。