CodeQL 2.26.2でSwift 6.3.3・Kotlin 2.4.10に対応|更新要否と確認手順

Swift 6.3.3やKotlin 2.4.10へ更新した後、「現在のGitHub CodeQLで正しく解析できるのか」「GitHub Enterprise Server側も更新が必要なのか」と迷うケースがあります。

結論として、Swift 6.3.3とKotlin 2.4.10への対応が追加されたのはCodeQL 2.26.2です。GitHub.comでGitHub管理のcode scanningを利用している場合、CodeQLの新バージョンは自動的に反映されるため、通常は利用者による更新作業は必要ありません。一方、旧バージョンのGitHub Enterprise Server(GHES)や外部CIでCodeQL CLIを運用している場合は、CodeQL 2.26.2以降への手動更新が必要になることがあります。(The GitHub Blog)

ただし、CodeQLのバージョンを上げただけで必ず解析が成功するわけではありません。KotlinのビルドモードやSwiftのビルド環境、解析対象言語の指定も併せて確認する必要があります。

目次

Swift 6.3.3・Kotlin 2.4.10を解析できるCodeQL版は?

Swift 6.3.3とKotlin 2.4.10の対応関係は次のとおりです。

対象言語解析対象のバージョン対応が追加されたCodeQL
SwiftSwift 6.3.3でビルドされたアプリCodeQL 2.26.2
KotlinKotlin 2.4.10までCodeQL 2.26.2

CodeQL 2.26.2では、Swift 6.3.3でビルドされたアプリを解析できるようになりました。Java/Kotlin解析では、Kotlin 2.4.10までがサポート対象になっています。(CodeQL)

KotlinはCodeQL上でJavaと共通の解析系として扱われます。ワークフローやCLIで言語を指定するときは、通常、言語識別子としてjava-kotlinを使用します。(GitHub Docs)

CodeQL 2.26.2は「対応開始版」

CodeQL 2.26.2は、Swift 6.3.3とKotlin 2.4.10への対応が始まった基準となるバージョンです。

新規導入時に、あえて2.26.2へ固定しなければならないわけではありません。運用環境で利用可能な、2.26.2より新しい安定版を選ぶのが基本です。CodeQLの公式変更履歴では2.26.2以降のバージョンも公開されているため、導入時点のリリースノートを確認して判断してください。(CodeQL)

判断基準は次のようになります。

  • CodeQL 2.26.1以前を使用している場合は更新対象
  • CodeQL 2.26.2ならSwift 6.3.3とKotlin 2.4.10の対応条件を満たす
  • 新規構築では、検証済みの新しい安定版を優先する
  • 社内規定でバージョン固定が必要な場合は、最低ラインを2.26.2とする

GitHub.comとGHESでは更新の必要性が異なる

CodeQLの更新が必要かどうかは、code scanningをどこで実行しているかによって変わります。

利用環境CodeQL 2.26.2への更新利用者が行うこと
GitHub.comのデフォルトセットアップ原則不要次回の解析結果を確認する
GitHub.comのCodeQL Action通常は自動反映ワークフローを実行してログを確認する
GitHub.comで独自CLI bundleを固定必要な場合ありCLIのバージョンを確認する
古いGHES必要な場合あり管理者が同梱版・配布bundleを確認する
インターネット非接続のGHES手動同期が必要な場合ありCodeQL Action sync toolを使用する
Jenkinsなどの外部CI原則として手動CodeQL bundleを更新する
ローカルのCodeQL CLI手動CLI bundleを入れ替える

GitHubは、GitHub.com上のcode scanning利用者に新しいCodeQLを自動展開しています。CodeQL 2.26.2の機能は将来のGHESリリースにも含まれますが、古いGHESを使用している場合はCodeQLを手動更新できると案内されています。(The GitHub Blog)

GitHub.comでは基本的に手動更新不要

GitHub.comで次の構成を利用している場合、通常はCodeQL CLIを自分でダウンロードし直す必要はありません。

  • code scanningのデフォルトセットアップ
  • 標準的なCodeQL Actionによる高度なセットアップ
  • GitHubが提供するCodeQL bundleを自動取得する構成

ただし、自動反映されたからといって、過去の解析結果がその場で自動的に作り直されるとは限りません。SwiftやKotlinのバージョンを更新した後は、次回のCodeQLワークフローが完了した時点で解析結果を確認してください。

GitHub Actionsのログは、リポジトリの「Actions」からCodeQLワークフローを開き、「Analyze」ジョブを選択して確認できます。(GitHub Docs)

CodeQL ActionのバージョンとCodeQL CLIのバージョンは別

ワークフロー内に、次のような記述があったとします。

uses: github/codeql-action/init@v4

このv4はCodeQL Actionのメジャーバージョンです。CodeQL CLI 2.26.2を意味するものではありません。

CodeQL Actionと、実際に解析を行うCodeQL CLI bundleは別に管理されます。GHESでは、アプライアンスやActionの構成に応じて特定のCodeQL bundleがダウンロードされるため、ワークフローに書かれた@v4だけを見てもSwift 6.3.3対応の有無は判断できません。(GitHub Docs)

現在のCodeQLバージョンを確認する方法

CodeQL CLIや外部CIを管理している場合は、最初に次のコマンドを実行します。

codeql version

JSON形式で取得したい場合は、次のように実行できます。

codeql version --format=json

codeql versionは、使用中のCodeQLツールチェーンのバージョンを表示する公式コマンドです。(GitHub Docs)

結果の判断方法は次のとおりです。

表示されたバージョン判断
2.26.1以前Swift 6.3.3・Kotlin 2.4.10対応のため更新する
2.26.2対応条件を満たしている
2.26.2より新しいビルドモードやリリースノートも確認する
コマンドが見つからないPATHまたはCLIの配置を確認する

更新したのに古いバージョンが表示される場合

新しいCodeQL bundleを展開しても、PATHの先頭に古いcodeqlが残っていると、古いバージョンが実行されます。

次の点を確認してください。

  • CIランナー上に複数のCodeQL CLIが残っていないか
  • PATHの先頭が新しいbundleを指しているか
  • ジョブごとに異なるランナーイメージを使用していないか
  • キャッシュされた古いツールを再利用していないか
  • 管理端末と実際の解析ランナーで確認結果が異なっていないか

確認時は、可能であれば絶対パスで実行します。

/path/to/new-codeql/codeql/codeql version

「管理者の端末では2.26.2だが、CIランナーでは2.25系だった」という状態を防げます。

CodeQL CLIを2.26.2以降へ更新する手順

外部CIやローカル環境では、CLI実行ファイルだけではなく、CodeQL bundle全体を更新するのが安全です。

CodeQL bundleには次の要素が含まれます。

  • CodeQL CLI本体
  • CLIと互換性のあるクエリおよびライブラリ
  • コンパイル済みの標準クエリ

GitHubは、CLI単体と任意のクエリソースを組み合わせるのではなく、互換性と解析性能を確保するためにCodeQL bundleの使用を推奨しています。(GitHub Docs)

更新手順

  1. 現在のcodeql versionを記録する
  2. CodeQL 2.26.2以降を含む公式bundleを取得する
  3. 既存環境とは別のディレクトリへ展開する
  4. CIランナーの参照先を新しいbundleへ変更する
  5. codeql versionを再実行する
  6. 対応言語とクエリパックを確認する
  7. 新しいCodeQLデータベースを作成して解析を実行する
  8. 旧版とのアラート差分を確認する
  9. 問題がなければ全ランナーへ展開する

対応言語の確認には、次のコマンドを使用できます。

codeql resolve languages

クエリパックの配置確認には、次のコマンドを使用します。

codeql resolve packs

codeql resolve languagesでは、現在のCLI packageでデータベースを作成できる言語を確認できます。codeql resolve packsでは、SwiftやJava/Kotlinのクエリパックが正しいbundle内から読み込まれているかを確認できます。(GitHub Docs)

ただし、resolve languagesswiftjava-kotlinが表示されるだけでは、Swift 6.3.3やKotlin 2.4.10への対応までは確認できません。最終的な対応バージョンは、codeql versionと公式変更履歴を組み合わせて判断します。

古いGHESでCodeQLを更新するときの注意点

GHESでは、アプライアンス本体のバージョンとCodeQL bundleのバージョンが必ずしも一致しません。

GHESのバージョン番号だけを見て「十分に新しい」と判断せず、次の情報を確認してください。

  • GHESに同梱されているCodeQL CLIのバージョン
  • GitHub Actionsランナーが実際に取得したbundle
  • 独自に同期しているCodeQL Actionのバージョン
  • 外部CI側で使用しているCLIのバージョン
  • インターネット接続の有無

特に、インターネットへ接続できないGHESでは、CodeQL Action sync toolを使ってGitHub.comからCodeQL Actionと解析bundleを同期できます。公式ドキュメントでは、この同期ツールによって最新リリースのCodeQL Actionと関連bundleをローカルへ同期できると説明されています。(GitHub Docs)

本番環境へ直接入れ替えるのではなく、まず検証用ランナーで次の項目を確認してください。

  • Swift 6.3.3のプロジェクトがビルドできるか
  • Kotlin 2.4.10のプロジェクトがビルドできるか
  • カスタムクエリが正常に動くか
  • 既存アラートが維持されているか
  • 新規アラートが大量発生していないか
  • 解析時間やメモリ使用量が許容範囲か

Kotlin 2.4.10ではbuild-modeの設定を確認する

CodeQL 2.26.2へ更新しても、Kotlinが解析されない代表的な原因がbuild-mode: noneです。

CodeQLではJavaをビルドせずに解析できますが、Java解析でbuild-mode: noneを選択した状態でKotlinファイルが存在しても、KotlinコードはCodeQLデータベースへ含まれません。GitHubも、この場合はKotlinコードが解析されず警告が表示されると案内しています。(GitHub Docs)

次のような設定になっている場合は注意してください。

build-mode: none

Kotlinを含むリポジトリでは、原則として次のいずれかを使用します。

  • autobuild
  • 手動ビルド
  • Kotlinを含む実際のGradleまたはMavenビルド

Kotlin 2.4.10対応を確認するときは、「CodeQLが2.26.2以上か」だけでなく、次の点も確認します。

  • 解析言語にjava-kotlinが含まれている
  • Kotlinコンパイラ2.4.10を使用したビルドがCI上で成功する
  • build-mode: noneになっていない
  • Gradle WrapperやMaven Wrapperが実行可能になっている
  • private registryや社内リポジトリへアクセスできる
  • コード生成処理が解析時にも実行されている

Swift 6.3.3ではビルド環境も必要

CodeQL 2.26.2はSwift 6.3.3でビルドされたアプリの解析に対応していますが、CodeQLが対応していることと、CI上でプロジェクトをビルドできることは別問題です。

Swiftはコンパイル言語であり、CodeQLデータベースを作成する際には、通常、autobuildまたは手動ビルドが使用されます。Kotlinについても同様に、ビルドを通じて必要なデータを抽出します。(GitHub Docs)

Swiftの解析が失敗する場合は、次の順番で切り分けてください。

  1. codeql versionが2.26.2以上か確認する
  2. ランナーに目的のSwiftツールチェーンがあるか確認する
  3. CodeQLを介さず通常のビルドが成功するか確認する
  4. Xcode、Swift Package Manager、依存パッケージの取得状況を確認する
  5. autobuildで失敗する場合は手動ビルドへ切り替える
  6. ビルド対象のschemeやconfigurationを明示する
  7. CodeQLワークフローを再実行する

バージョン更新後にエラーが出た場合でも、すぐに「CodeQL 2.26.2がSwift 6.3.3へ対応していない」と判断してはいけません。通常ビルドも失敗するのであれば、CodeQLではなくツールチェーンや依存関係が原因です。

SwiftとKotlinを含むモノレポでは言語を明示する

iOSアプリとAndroidアプリを同じリポジトリで管理している場合、SwiftとKotlinの両方を明示的に解析対象へ含めることが重要です。

高度なセットアップで解析言語を明示しない場合、複数のコンパイル言語が存在していても、ソースファイル数が最も多い言語だけが暗黙的に選ばれることがあります。GitHubは、必要な言語をワークフローのmatrixへ追加するよう案内しています。(GitHub Docs)

たとえば、次の2つを別ジョブとして設定する構成が分かりやすいでしょう。

対象CodeQLの言語指定推奨ランナーの考え方
iOSアプリswiftSwiftプロジェクトをビルドできる環境
Androidアプリjava-kotlinGradleやJDKを利用できる環境

「CodeQL 2.26.2へ更新したのにKotlinだけ解析されない」という場合、バージョンではなく、言語matrixからjava-kotlinが漏れている可能性もあります。

更新後にアラートが増えても不具合とは限らない

CodeQL 2.26.2では、言語バージョン対応だけでなく、既存クエリの精度改善も行われています。

Java/Kotlinでは、java.io.File.getName()がパストラバーサル要素の..を除去しないことから、パスインジェクションに対する完全なサニタイザーとして扱われなくなりました。そのため、CodeQLの更新後にjava/path-injection関連のアラートが新しく検出される可能性があります。(CodeQL)

たとえば、次のような処理です。

String name = new File(userInput).getName();
File target = new File(uploadDirectory, name);

getName()を通しただけで安全と判断せず、..や想定外のパス要素が残っていないか確認する必要があります。

更新前後でソースコードを変更していなくても、クエリやデータフローモデルが改善されればアラート数は変化します。新規アラートを一括で誤検知扱いにせず、次の分類を行ってください。

  • 実際に修正が必要な脆弱性
  • 新しいモデルによって可視化された既存問題
  • ビルド条件の変化による解析範囲の拡大
  • 重複アラート
  • 業務上許容できるリスク
  • 誤検知として根拠を記録できるもの

カスタムクエリのメッセージ記法にも変更がある

CodeQL 2.26.2では、アラートメッセージ内の[[形式によるリンク記法が廃止されました。

独自のCodeQLクエリでリンクを埋め込んでいる場合は、$@のプレースホルダーペアを使用する形式へ変更する必要があります。これはドキュメント化されていなかった旧式機能に対する破壊的変更です。(The GitHub Blog)

標準クエリだけを使用している一般利用者への影響は限定的ですが、社内クエリパックを運用している組織は事前検証が必要です。

解析できないときの切り分け表

症状考えられる原因最初に確認すること
Swift 6.3.3を認識できないCodeQLが古いcodeql version
Kotlin 2.4.10を認識できないCodeQLが古い2.26.2以上か
Kotlinファイルが解析対象に入らないbuild-mode: noneautobuildまたは手動ビルドへ変更
Swiftだけ解析されないビルド環境不足通常のSwiftビルドが成功するか
Kotlinだけ解析されない言語指定漏れjava-kotlinが設定されているか
モノレポの片方しか解析されない暗黙の言語検出SwiftとJava/Kotlinを明示する
更新後にアラートが増えたクエリ精度の改善新旧アラートの差分を確認する
更新後も古い版が使われるPATHやキャッシュ実行ファイルの絶対パスを確認する
カスタムクエリの表示が変わった旧リンク記法[[形式を見直す
GHESだけ対応しない同梱bundleが古いGHES管理者にCLI版を確認する

CodeQL 2.26.2への対応で次に行うこと

Swift 6.3.3とKotlin 2.4.10への対応開始版はCodeQL 2.26.2です。GitHub.comの標準的なcode scanning環境では自動反映されるため、まず次回のワークフロー結果を確認します。

GHES、外部CI、ローカルCLIでは、次の順番で対応してください。

  1. codeql versionを実行する
  2. 2.26.1以前ならCodeQL bundleを更新する
  3. codeql resolve languagesで対象言語を確認する
  4. Kotlinではbuild-mode: noneを使用しない
  5. SwiftとKotlinの通常ビルドが成功することを確認する
  6. モノレポではswiftjava-kotlinを明示する
  7. 更新後の新規アラートを差分確認する
  8. 検証後に本番ランナーへ展開する

重要なのは、CodeQL 2.26.2への更新だけで完了と考えないことです。バージョン、言語指定、ビルドモード、ランナー環境の4点をセットで確認することで、Swift 6.3.3とKotlin 2.4.10を安定して解析できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次