mp3gain は安全か: 既知の脆弱性、修正済みのビルド、メモリ安全な代替
更新 · mp3rgain v3.16.2
どのビルドを使っているかによります。 mp3gain 1.6.2 と同梱コードには 21 件の CVE が公開されており、ほぼすべてが、細工された音声ファイルで起こるメモリ関連の不具合です。Debian と Ubuntu のパッケージは修正済みです。SourceForge の Windows 版と Chocolatey のパッケージは未修正で、修正を含む公式リリースは出ていません。aacgain は、どの配布元でも修正されていません。 mp3rgain は Rust で書かれた別のプログラムで、これらのコードを一切共有していません。
mp3gain はマルウェアではありません。自分で CD から取り込んだファイルに使う限り、現実的なリスクは小さいと考えられます。問題になるのは、ダウンロードしたファイルや共有フォルダ、他人が作ったライブラリなど、出どころを自分で管理していないファイルを開く場合です。このページでは、わかっていること、修正済みのビルド、mp3rgain の違いと、その主張の限界をまとめます。
脆弱性のある場所
ほとんどが次の 2 か所にあります。
- 同梱の MP3 デコーダー。 mp3gain は解析用に、mpg123 の mpglib を古い時点で分岐させたもの (
mpglibDBL) を同梱しています。mpg123 本体には長年セキュリティ修正が入っていますが、この分岐には入っていません。1.6.x 以降はシステムの libmpg123 を使ってビルドでき、その場合はこれらを避けられますが、Windows 版や多くのパッケージは同梱コードを使っています。 - APE タグの処理。 mp3gain 独自のタグを読み書きする
apetag.cに、複数のバッファオーバーフローがあります。
デコーダーと解析
| CVE | 年 | 種類(原文) | 場所 |
|---|---|---|---|
| CVE-2003-0577 | 2003 | Denial of service (invalid bitrate) | common.c |
| CVE-2004-0805 | 2004 | Buffer overflow | layer2.c |
| CVE-2004-0991 | 2004 | Buffer overflow (MPEG header) | mpglib |
| CVE-2006-1655 | 2006 | Heap overflow (multiple) | layer3.c |
| CVE-2017-12912 | 2017 | Buffer over-read | layer3.c |
| CVE-2017-14406 | 2017 | NULL pointer dereference | interface.c |
| CVE-2017-14407 | 2017 | Stack buffer over-read | gain_analysis.c |
| CVE-2017-14408 | 2017 | Buffer over-read | layer3.c |
| CVE-2017-14409 | 2017 | Buffer overflow (CVSS 7.8, high) | layer3.c |
| CVE-2017-14410 | 2017 | Read access violation | layer3.c |
| CVE-2017-14411 | 2017 | Stack buffer overflow | interface.c |
| CVE-2017-14412 | 2017 | Invalid memory write | interface.c |
| CVE-2017-9872 | 2017 | Buffer over-read | layer3.c |
| CVE-2018-10776 | 2018 | Segfault, denial of service | common.c |
| CVE-2018-10778 | 2018 | Read access violation | layer3.c |
| CVE-2020-15359 | 2020 | Stack overflow (code execution) | Local variable overflow |
| CVE-2021-34085 | 2021 | Out-of-bounds read, memory corruption (CVSS 9.8, critical) | layer3.c |
CVE-2020-15359 は VDA Labs がファザーの Mayhem で発見したもので、約 6,000 件のテストケースから約 1,600 件のクラッシュが報告されました。その一部は、コード実行につながりうるポインタの上書きでした。
APE タグ
| CVE | 年 | 種類(原文) | 場所 |
|---|---|---|---|
| CVE-2017-12911 | 2017 | Stack memory corruption | apetag.c |
| CVE-2018-10777 | 2018 | Buffer overflow | apetag.c |
| CVE-2019-18359 | 2019 | Buffer over-read (CVSS 5.5, medium) | apetag.c |
| CVE-2023-49356 | 2023 | Stack buffer overflow (CVSS 7.5, high) | apetag.c |
この 4 件は、2025-11-01 にメンテナーが Debian と openSUSE のパッチをソースリポジトリに適用して修正されました。ただしその後リリースは出ていないため、配布済みのバイナリや、1.6.2 のリリースからビルドされたパッケージには含まれていません。
修正済みの mp3gain はどれか
修正を含む公式リリースがないため、対応は配布元ごとに異なります。2025 年 11 月時点の状況です。
| 入手元 | バージョン | 修正 | 備考 |
|---|---|---|---|
Debian、Ubuntu (apt) | 1.6.2-3 | 済み | 最も網羅的なパッチ。システムの libmpg123 を使用 |
| openSUSE | 1.6.2 | 一部 | 2020 年にセキュリティ更新 |
| Fedora | 1.6.2 | 一部 | 一部の CVE を Bugzilla で追跡 |
| Homebrew | 1.6.2 | なし | libmpg123 を使うためデコーダーの CVE は避けられるが、APE タグの修正はなし |
| Arch Linux (AUR) | 1.6.2 | なし | 公式リポジトリから削除済み。ユーザーによる管理 |
| Chocolatey | 1.5.2 | なし | 2014 年以降更新なし。古いデコーダーを同梱 |
| SourceForge(Windows 版) | 1.2.5(安定版) | なし | 2004 年頃のバイナリ。上記すべての CVE の影響を受ける |
出典: Debian セキュリティトラッカー、Repology、パッチが上流に適用された SourceForge のバグ #62。
aacgain
aacgain は mp3gain に AAC 対応を加えた派生版です。最後のリリースは 2.0.0(2019 年 12 月)、最後のコミットは 2022 年 7 月です。依存ライブラリをすべてソースで同梱しており、どれもセキュリティ更新されていません。同じ mpglibDBL デコーダーと未修正の apetag.c に加えて、それぞれ独自の CVE を持つ faad2 と mp4v2 を含みます。修正済みの aacgain を配布しているディストリビューションはなく、Homebrew は 2023 年 4 月にメンテナンスされていないとして非推奨にしました。
mp3rgain は何が違うか
mp3rgain は修正を当てた派生版ではなく、書き直しです。mp3gain や aacgain とコードを共有していません。
| 処理 | mp3gain、aacgain | mp3rgain |
|---|---|---|
| ゲインの変更 | ビットストリーム内の global_gain を書き換える (C) | 同じ方法 (Rust) |
| 解析のためのデコード | mpglib または libmpg123、AAC は faad2 (C) | Symphonia (Rust) |
| MP4 コンテナ | mp4v2 (C) | Symphonia と mp3rgain 自身のパーサー (Rust) |
| APE タグ | apetag.c (C) | mp3rgain 自身の実装 (Rust) |
mp3rgain 自身のソース(ライブラリ、コマンドラインツール、デスクトップアプリ)には unsafe ブロックがなく、デコードに使う Symphonia の各クレートにもありません。安全な Rust では、範囲外へのアクセスはメモリを壊すのではなくエラーでプログラムを止め、解放後の使用、ヌル参照、データ競合はコンパイル時に拒否されます。上の CVE のほぼすべてを占めるバッファオーバーフローや範囲外読み取りは、まさにこの仕組みで防がれる種類の不具合です。
ここで主張していないこと。 これは設計の説明であり、検証済みの保証ではありません。CVE の実証ファイルは mp3rgain のテストに含まれておらず、ファジングの仕組みもまだありません。安全な Rust でも通常のバグはなくなりません。壊れたファイルによって mp3rgain がエラーで止まったり、必要以上にメモリを使ったりする可能性はあります。また rayon など一部の依存ライブラリは内部で unsafe を使っています。こうした問題を見つけた場合は 報告 をお願いします。
自分で確かめる
# mp3rgain 自身のコードに unsafe ブロックがないこと(何も表示されません)
grep -rnw unsafe src mp3rgui/src
# 既知の脆弱性を持つ依存ライブラリがないこと(CI でも実行しています)
cargo audit
cargo audit --file mp3rgui/Cargo.lock
配布ファイルには SHA-256 のファイルが付き、v3.16.0 以降は GitHub のビルド来歴証明も付いています。これにより、そのファイルが本リポジトリのリリース用ワークフローで、該当タグからビルドされたことを確認できます。
gh attestation verify mp3rgain-v3.16.2-windows-x86_64.zip --repo M-Igashi/mp3rgain
アプリはネットワーク通信を行わず、利用状況の収集もしません。Windows 版のバイナリにコード署名はありません。macOS 版のアプリは Developer ID で署名され、公証を受けています。
いま mp3gain を使っている方へ
- Debian や Ubuntu で
aptから入れた場合: 修正済みのビルドです。乗り換えは任意です。mp3rgain に替えると、AAC 対応、並列処理、BS.1770 の測定が加わります。 - Windows で SourceForge や Chocolatey から入れた場合: そのバイナリには修正が一切入っていません。mp3rgui は同じ操作の流れで使える、メンテナンスの続いているアプリで、MP3Gain で調整済みのファイルを元に戻すこともできます。
- aacgain を使っている場合: 修正済みのビルドはありません。mp3rgain は同じ M4A ファイルを、同じオプションで扱えます。
- スクリプトやコンテナ、CI で使っている場合: オプション、TSV 出力、undo タグが互換なので、たいていはコマンド名を置き換えるだけで移行できます。
各ディストリビューションの勧告を含む参照元の一覧は、GitHub の docs/security.md(英語)にあります。