CVE-2026-15043とは?Azure Linux 3.0のPerl DBIを1.651-1へ更新する手順

Azure Linux 3.0でperl-DBI 1.643-5を使用している場合は、perl-DBI 1.651-1以降へ更新する必要があります。CVE-2026-15043は、Perl DBIに内蔵された簡易SQLエンジンDBI::SQL::Nanoで、文字列に対する比較演算子<=>=が逆向きに評価される脆弱性です。

この問題が厄介なのは、処理がエラーで停止するのではなく、条件と反対側のデータが正常な検索結果として返される点です。アクセス制御、帳票出力、ファイルベースのデータ抽出などに該当条件を使用していると、本来取得してはいけない行が含まれる可能性があります。上流のPerl DBIでは1.42から1.650までが影響を受け、1.651で修正されています。Azure Linux 3.0向けには1.651-1が公開されています。()

目次

CVE-2026-15043の概要

CVE-2026-15043の要点は次のとおりです。

項目内容
対象Azure Linux 3.0のperl-DBI
確認されている対象バージョン1.643-5
上流DBIの影響範囲1.42以上、1.651未満
問題のある機能DBI::SQL::Nanoの文字列比較
誤動作する演算子<=>=
修正版Azure Linux 3.0では1.651-1、上流DBIでは1.651
主な影響WHERE句による抽出結果の誤り、フィルターのすり抜け
MSRCの個別回避策掲載なし

注意したいのは、Azure Linux 3.0のリポジトリに存在するperl-DBI 1.650-1も修正版ではないことです。上流の影響範囲は1.650までであるため、「1.643-5より新しいから安全」とは判断できません。更新後のRPMバージョンが1.651-1以上であることを確認してください。()

文字列の「以下」と「以上」が逆に評価される仕組み

問題は、DBI::SQL::Nanoが数値ではない値を文字列として比較する処理にあります。

本来、SQLとPerlの文字列比較は次のように対応する必要があります。

SQLの条件本来使用すべきPerl演算子脆弱な実装で使用されていた演算子
値 <= 境界値lege
値 >= 境界値gele

つまり、<=では「以下」ではなく「以上」、>=では「以上」ではなく「以下」として判定されていました。修正コミットでは、この2つの演算子が正しい向きへ置き換えられています。(GitHub)

たとえば、文字列列に次の値が入っているとします。

A
M
Z

次のSQLは、本来AMを返すべきです。

SELECT * FROM sample_table
WHERE code <= 'M';

しかし、影響を受ける実装では、実質的にcode >= 'M'として評価されるため、MZが返されます。

逆に、次のSQLは本来MZを返します。

SELECT * FROM sample_table
WHERE code >= 'M';

脆弱な実装ではMAが返されます。

境界値と等しいMはどちらの結果にも含まれるため、少量のテストデータでは問題を見落とすことがあります。検証時には、境界値より小さい値、等しい値、大きい値の3種類を必ず用意することが重要です。

すべてのPerl DBI環境が同じ影響を受けるわけではない

perl-DBIがインストールされているだけで、直ちに問題のコードが実行されるわけではありません。直接的な影響を受ける可能性が高いのは、次の条件が重なる環境です。

  • Azure Linux 3.0上で、1.651未満のDBIを実行している
  • アプリケーションがDBI::SQL::Nanoを使用している
  • ファイルベースのDBIドライバーを使用している
  • WHERE句で文字列に対する<=または>=を使用している
  • その検索結果が権限制御、データ公開範囲、帳票出力などに利用されている

DBI::SQL::Nanoは、DBIに組み込まれた簡易SQLエンジンです。DBD::FileDBD::DBM、CSV系などのファイルベースドライバーで、SQL::Statementが利用できない場合にフォールバックとして使われることがあります。また、環境変数DBI_SQL_NANO=1で明示的に使用させる構成もあります。()

MySQLやPostgreSQLなど、データベースサーバー側がSQLを評価する一般的な構成では、同じDBI::SQL::Nanoの処理を必ず通るわけではありません。ただし、アプリケーションの一部だけがCSVやDBMファイルを扱っているケースもあるため、DBIの接続先を名前だけで判断せず、実際に使用しているドライバーを確認する必要があります。

セキュリティ問題になるケースと、データ不整合で終わるケース

上流のアドバイザリでは、誤った述語評価によってファイルベースのフィルターを回避できる可能性が指摘されています。一方で、この問題自体はSQLインジェクションや任意コード実行を発生させるものではありません。危険度は、誤った検索結果が何に使われるかによって大きく変わります。()

利用場面想定される影響対応優先度
ユーザーごとの閲覧可能範囲をWHERE句で制御許可されていない行が返る可能性最優先
個人情報や機密情報のエクスポート対象外データがファイルに含まれる可能性最優先
ユーザー入力を比較境界として利用入力値によってフィルターをすり抜ける可能性
請求、在庫、集計バッチ誤集計や対象データの取り違え
管理画面の参考表示表示結果の誤り
DBIは存在するがSQL::Nanoを使用していない直接的な影響は限定的更新は必要

特に確認すべきなのは、WHERE句が単なる検索条件ではなく、アクセス制御の代わりとして使われていないかです。

たとえば、「ユーザーの権限コード以下のデータだけを表示する」といった設計で文字列比較を使用している場合、結果が逆転すると、本来より高い権限に属するデータが返る可能性があります。

Azure Linux 3.0で影響を確認する手順

OSとインストール済みRPMを確認する

最初に、対象ホストがAzure Linux 3.0であることと、perl-DBIのRPMバージョンを確認します。

cat /etc/os-release

rpm -q --qf '%{NAME} %{VERSION}-%{RELEASE} %{ARCH}\n' perl-DBI

影響を受ける環境では、次のような結果が表示される可能性があります。

perl-DBI 1.643-5.azl3 x86_64

次の結果も修正前です。

perl-DBI 1.650-1.azl3 x86_64

修正済みと判断できる基準は、次のバージョンです。

perl-DBI 1.651-1.azl3 x86_64

MicrosoftのAzure Linux 3.0向けx86_64リポジトリでは、1.643-51.650-1に加えて、修正版の1.651-1が公開されています。(packages.microsoft.com)

Perlが実際に読み込むDBIも確認する

RPMの情報だけでなく、Perlプロセスが実際に読み込むDBIのバージョンとパスも確認します。

perl -MDBI -e 'printf "DBI=%s\nPATH=%s\n", $DBI::VERSION, $INC{"DBI.pm"}'

修正後の例は次のとおりです。

DBI=1.651
PATH=/usr/lib/perl5/vendor_perl/DBI.pm

RPMと実行時バージョンの両方を確認する理由は、CPANやcpanmで別のDBIがインストールされている可能性があるためです。

たとえば、RPMは1.651-1でも、/usr/local/lib配下に古いDBI.pmが残っていると、Perlの検索パス順序によって古いモジュールが読み込まれることがあります。反対に、実行時DBIだけを更新してRPMを放置すると、パッケージ管理上の状態と実行環境が一致しなくなります。

更新可能なバージョンを確認する

Azure Linuxではtdnfを使用してパッケージを管理します。

sudo tdnf makecache
tdnf list perl-DBI

一覧に1.651-1以上が表示されることを確認します。Microsoft Learnでも、Azure Linuxのパッケージ確認にはtdnf list、更新にはtdnf updateを使用する手順が案内されています。(Microsoft Learn)

修正版が表示されない場合は、次の点を確認してください。

  • リポジトリメタデータが更新されているか
  • 社内ミラーへの同期が完了しているか
  • プロキシやファイアウォールでリポジトリ通信が遮断されていないか
  • 使用しているアーキテクチャ向けに修正版が提供されているか
  • パッケージがバージョン固定されていないか

DBI::SQL::Nanoを強制していないか確認する

現在のシェルでは、次のコマンドで環境変数を確認できます。

env | grep '^DBI_SQL_NANO='

アプリケーションの設定ファイルや起動スクリプトも検索します。

grep -R --line-number 'DBI_SQL_NANO' \
  /etc /opt /srv /usr/local 2>/dev/null

systemdサービスとして起動している場合は、サービス定義も確認します。

systemctl cat <サービス名>

コンテナーの場合は、Dockerfile、Composeファイル、KubernetesのDeploymentやConfigMap、Secretも調査対象です。

DBI_SQL_NANOが見つからなくても、フォールバックによって使用される可能性があります。環境変数がないことだけで影響なしとは判断しないでください。

ファイルベースのドライバーを探す

アプリケーションのソースや設定から、関連するドライバーを探します。

grep -R --line-number -E \
  'DBD::(File|DBM|CSV)|dbi:(File|DBM|CSV)' \
  /opt /srv /usr/local 2>/dev/null

さらに、対象アプリケーションで文字列列に対する<=または>=を使用していないか確認します。

検索時には、次のような処理を重点的に調べます。

  • ユーザー権限や公開範囲の絞り込み
  • CSVやローカルファイルからのデータ抽出
  • 文字列の日付を使った期間指定
  • ランク、区分、コードによる範囲指定
  • バッチ処理の対象選択
  • 帳票やエクスポートの抽出条件

単純なソースコード検索では、Perl側の比較演算子やHTMLまで大量に検出されます。検索結果をそのまま影響件数とせず、SQL文字列として実行される箇所を個別に確認してください。

perl-DBIを1.651-1へ更新する手順

VMや通常のAzure Linuxホストを更新する

変更前に、対象アプリケーション、依存パッケージ、ロールバック方法を確認します。その後、次のコマンドで更新します。

sudo tdnf makecache
sudo tdnf update perl-DBI

更新後は、RPMと実行時モジュールの両方を確認します。

rpm -q --qf '%{NAME} %{VERSION}-%{RELEASE} %{ARCH}\n' perl-DBI

perl -MDBI -e 'printf "DBI=%s\nPATH=%s\n", $DBI::VERSION, $INC{"DBI.pm"}'

期待する結果は、少なくとも次の状態です。

perl-DBI 1.651-1.azl3 x86_64
DBI=1.651

上流DBIの1.651では、CVE-2026-15043に対応する文字列比較の修正がリリース内容として明記されています。(MetaCPAN)

長時間動作しているPerlプロセスを再起動する

パッケージを更新しても、すでに起動しているPerlプロセスは、メモリ上に読み込んだ古いモジュールを使用し続ける可能性があります。

更新後は、該当するサービスやワーカーを再起動します。

sudo systemctl restart <サービス名>
sudo systemctl status <サービス名>

cronから毎回新しいPerlプロセスを起動する処理では、次回実行から新しいモジュールが読み込まれます。ただし、常駐型のジョブワーカー、Webアプリケーション、デーモンは明示的に再起動してください。

コンテナーはイメージを再ビルドする

Azure Linux 3.0のコンテナーで使用している場合、稼働中のコンテナーだけを手作業で更新しても、再作成時に元の脆弱な状態へ戻ります。

Dockerfileまたはビルド工程で更新します。

RUN tdnf makecache \
    && tdnf update -y perl-DBI

その後、次の流れで再展開します。

  1. コンテナーイメージを再ビルドする
  2. CIでperl-DBI 1.651-1以上を検証する
  3. 新しいイメージをレジストリへ登録する
  4. ステージング環境で比較条件をテストする
  5. 本番環境のPodやコンテナーを入れ替える
  6. 古いイメージタグを再利用しない

実行中のコンテナーへ一時的にパッチを適用する方法は、調査目的には使えても恒久対応にはなりません。修正版を含むイメージを成果物として残すことが重要です。

更新後に実施する回帰テスト

境界値の前後を含む3点で確認する

文字列の比較対象として、境界値より小さい値、等しい値、大きい値を用意します。

テスト値値 <= 'M'の期待値値 >= 'M'の期待値
A
M
Z

実際のアプリケーションで、次の両方を実行します。

SELECT * FROM sample_table
WHERE code <= 'M';
SELECT * FROM sample_table
WHERE code >= 'M';

上流の修正にも、>=<=の文字列比較を確認するテストが追加されています。(GitHub)

検証用の値には、単純な英字だけでなく、実データに含まれる形式も使います。

  • 大文字と小文字
  • 数字を含む文字列
  • 日付形式の文字列
  • 日本語を含む値
  • 空文字列
  • NULL
  • 境界値と完全に一致する値

ただし、文字コード、正規化、照合順序によって結果が変わる可能性があります。最終確認は、対象アプリケーションと実際のドライバーを使用して行ってください。

エラーの有無ではなく取得行を確認する

この脆弱性では、SQLの実行自体が正常終了することがあります。

そのため、次の確認だけでは不十分です。

  • 例外が発生しなかった
  • HTTPステータスが200だった
  • バッチが正常終了した
  • ログにエラーがなかった

更新前後で、取得件数と取得された行の内容を比較してください。特に、権限制御や機密情報の抽出に使われる処理では、テストユーザーごとの取得可能範囲を確認する必要があります。

過去に生成した結果も確認する

更新によって修正されるのは、今後実行される比較処理です。影響期間中に作成された次の成果物は自動的には修正されません。

  • CSVエクスポート
  • 帳票
  • 請求データ
  • 集計結果
  • キャッシュ
  • 他システムへ連携したファイル
  • アクセス判定の監査記録

該当するコードパスが確認された場合は、アプリケーションのリリース履歴とDBIの導入履歴から影響期間を特定し、重要な処理を再実行または再照合してください。

MSRCに個別回避策がない場合の考え方

MSRCのCVE-2026-15043ページには、Azure Linux 3.0向けの個別回避策が掲載されていません。そのため、基本対応はperl-DBI 1.651-1以降への更新です。(msrc.microsoft.com)

すぐに更新できない場合は、修正の代わりではなく、一時的なリスク低減策として次を検討します。

  • 該当するバッチやエクスポート処理を一時停止する
  • 文字列の<=>=に依存するアクセス制御を使用しない
  • 出力ファイルを外部へ送信する前に内容を確認する
  • 対象データファイルの読み取り権限を必要最小限にする
  • ユーザーが比較境界を自由に指定できる機能を一時的に制限する
  • 影響するAPIを管理者だけに限定する
  • 更新までの操作と出力結果を記録する

独自に比較条件を書き換えたり、SQLエンジンを切り替えたりすると、別の互換性問題が発生する可能性があります。緊急変更を行う場合も、本番データと同じ形式で回帰テストを行ってください。

対応時に起こりやすい失敗

1.650-1を修正版だと判断する

最も注意したい誤りです。1.650-11.643-5より新しいものの、上流の修正版は1.651です。

Azure Linux 3.0では、1.651-1以上を基準にしてください。()

RPMの表示だけで対応完了とする

CPANで導入した別のDBIが優先されることがあります。次の2つを両方確認します。

rpm -q perl-DBI
perl -MDBI -e 'print "$DBI::VERSION $INC{\"DBI.pm\"}\n"'

数値列だけをテストする

CVE-2026-15043で問題になっているのは、非数値として処理される文字列比較です。数値列のテストだけでは修正確認になりません。文字列列と実際のドライバーを使用してください。()

更新後に常駐プロセスを再起動しない

ディスク上のモジュールだけが新しくなり、稼働中のプロセスでは古いコードが残る可能性があります。Webサービスやワーカーの再起動までを更新手順に含めます。

エラーログだけを調査する

今回の問題では、誤った行が正常な結果として返る可能性があります。エラー件数ではなく、検索結果そのものを監査してください。

稼働中のコンテナーだけを修正する

コンテナーを再作成すると脆弱な状態へ戻ります。Dockerfile、ベースイメージ、CIのバージョンチェックを更新し、修正版を含むイメージへ置き換える必要があります。

CVE-2026-15043への対応で実施すべきこと

Azure Linux 3.0の管理者は、次の順番で対応します。

  1. rpm -q perl-DBIでRPMバージョンを確認する
  2. perl -MDBIで実行時バージョンと読み込みパスを確認する
  3. DBI::SQL::Nano、ファイルベースドライバー、文字列の<=>=の利用箇所を調査する
  4. tdnf update perl-DBI1.651-1以降へ更新する
  5. 常駐するPerlプロセスやコンテナーを再起動・再展開する
  6. 境界値の前後を含む回帰テストを行う
  7. 権限制御やデータ出力に使っていた場合は、過去の取得結果も監査する

CVE-2026-15043は、派手なクラッシュやエラーメッセージではなく、検索結果を静かに反転させるタイプの問題です。perl-DBIの存在だけで影響を決めつける必要はありませんが、バージョン、実行時の読み込み先、SQL::Nanoの利用有無、文字列比較の用途を分けて確認することが重要です。

最初の対応として、Azure Linux 3.0上でrpm -q perl-DBIを実行し、1.651-1未満であれば更新計画を立ててください。

この記事を書いた人

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

コメント

コメントする

目次