初めに #
レットハット系のLinuxでは、「RPMファイル」という形式でソフトウェアが配布されています。
普段は dnf
や yum
といったパッケージ管理ツールを利用しインストールするだけで済みますが、そのファイルにはソースコードやパッチファイルといった重要な情報が含まれています。
本記事では、AlmaLinuxを使ってRPMファイルを展開し、ソースコードや修正内容を確認する方法をわかりやすく解説します。
とくに、CVEなどのセキュリティ修正につながるパッチの確認も取り上げているため、「このソフトは安全なのか?」「どんな修正が入っているのか?」といった疑問をお持ちの方はぜひ利用してみてください。
RPMファイルとは #
RPMとはRed Hat系のLinux(RHELやCentOS、AlmaLinuxなど)で採用されているパッケージファイルとなります。
ファイル内にはソフトウェアを構成するファイル群と、そのメタデータが含まれています。
また、RPMパッケージには大きく2種類の形式があります。
- ソースRPM
ソフトウェアのソースコード一式と、そのソースからバイナリRPMをビルドするための手順を記述したスペックファイルを含むパッケージとなります。 また、必要に応じて、ソースコードに当てるパッチファイルも含まれております。
こちらは、開発者やパッケージメンテナが参照するものとなっております。
今回はこちらを確認対象としております。
- バイナリーRPM
ビルド済みの実行ファイルやライブラリなど、実際にシステムにインストールされるバイナリデータを含むパッケージとなります。
先述したソースRPMからビルドされた成果物となっており、一般ユーザーが dnf install
コマンドでインストールする場合などに利用されます。
RPMファイルの取得方法 #
AlmaLinuxでは dnf
コマンドを用いてインターネット上の公式リポジトリからパッケージを取得する事が出来ます。
通常の dnf install
コマンドではシステムに直接インストールされるため、以下のように download
オプションを付与し実行します。
dnf download --source パッケージ名
例えば、「 nginx
」のパッケージを取得する場合は以下のようになります。
# dnf download --source nginx
enabling appstream-source repository
enabling baseos-source repository
enabling extras-source repository
AlmaLinux 9 - AppStream - Source 999 kB/s | 855 kB 00:00
AlmaLinux 9 - BaseOS - Source 401 kB/s | 336 kB 00:00
AlmaLinux 9 - Extras - Source 6.5 kB/s | 7.9 kB 00:01
nginx-1.20.1-22.el9_6.3.alma.1.src.rpm 892 kB/s | 1.1 MB 00:01
ダウンロードを実行するとカレントディレクトリに rpm
ファイルが保存されます。
以下は先ほど取得した nginx
の rpm
ファルとなります。
# ls
nginx-1.20.1-22.el9_6.3.alma.1.src.rpm
補足 #
CentOS などの dnf
コマンドが利用できない環境では「 yumdownloader
」コマンドを利用する事で rpm
ファイルを取得する事が可能です。
yumdownloader --source パッケージ名
必要コマンドのインストール #
RPMファイルを展開するためには、rpm2cpio
コマンドおよび cpio
コマンドが必要となります。
これらはAlmaLinux環境にデフォルトでインストールされていないため、以下のコマンドにて必要なパッケージを導入してください。
dnf install rpm-build cpio
インストールが完了したら以下のコマンドにて導入が確認できます。
rpm -q rpm-build
rpm -q cpio
以下は上記の実行結果となります。
# rpm -q rpm-build
rpm-build-4.16.1.3-37.el9.x86_64
# rpm -q cpio
cpio-2.13-16.el9.x86_64
結果が表示されていれば、事前準備は完了となります。
RPMファイルの展開 #
RPMファルはアーカイブ形式になっているためダウンロードし、そのまま開いて中身を見ることはできません。
今回は以下の手順にて展開を行っていきます。
- 作業用ディレクトリの作成
- rpm2cpioコマンドにて変換
- cpioコマンドで展開
- ソースコードを解凍
1. 作業用ディレクトリの作成 #
初めに、作業用のディレクトリをあらかじめ作成しておくことをおすすめします。
本作業では、RPMファイルを展開する過程で多数のファイルやディレクトリが出力されます。
そのため、ホームディレクトリなどで直接作業を行うと、ファイルが混在してしまい管理が難しくなる可能性があります。
作業の整理とトラブル防止のため、以下のように専用のディレクトリを作ってから作業を開始しましょう。
mkdir nginx_src
cd nginx_src
2. rpm2cpioコマンドにて変換する #
次に「 rpm2cpio
」コマンドを利用しcpio形式に変換します。
rpm2cpio ダウンロードしたrpmファイル > 任意の名前.cpio
今回ダウンロードした nginx を変換する場合は、以下のように実行します。
rpm2cpio nginx-1.20.1-22.el9_6.3.alma.1.src.rpm > nginx.cpio
書き出すファイル名は任意の名前で設定可能です。
今回は分かりやすいように「 nginx.cpio
」として書き出しました。
書き出しが完了すると以下のようにカレントディレクトリに指定した名前の .cpio
ファイルが出力されます。
# ls
nginx-1.20.1-22.el9_6.3.alma.1.src.rpm nginx.cpio
3. cpioコマンドで展開 #
次に「 cpio
」コマンドを利用しアーカイブを展開します。
cpio -idv < 設定したファイル名.cpio
以下は cpio
コマンドのオプション詳細となります。
オプション | 意味 | 説明 |
---|---|---|
i |
抽出 | アーカイブ内のファイルを現在のディレクトリに展開します。 |
d |
make directories | 必要に応じて、アーカイブ内のディレクトリ構造を再現して作成します。 |
v |
verbose | 展開されるファイル名を1行ずつ表示し、処理の進捗を可視化します。 |
先ほど変換した nginx.cpio
を展開する場合は以下となります。
cpio -idv < nginx.cpio
以下は上記を実行した結果となります。
# cpio -idv < nginx.cpio
0001-remove-Werror-in-upstream-build-scripts.patch
0002-fix-PIDFile-handling.patch
0003-Support-loading-cert-hardware-token-PKC.patch
0004-Set-proper-compiler-optimalization-level-O2-for-perl.patch
0005-Init-openssl-engine-properly.patch
0006-Fix-ALPACA-security-issue.patch
0007-Enable-TLSv1.3-by-default.patch
0008-CVE-2023-44487-HTTP-2-per-iteration-stream-handling.patch
0009-defer-ENGINE_finish-calls-to-a-cleanup.patch
0010-Optimized-chain-link-usage.patch
0011-CVE-2024-7347-Buffer-overread-in-the-mp4-module.patch
0012-CVE-2022-41741-and-CVE-2022-41742-fix.patch
0013-SSL-use-of-the-SSL_OP_IGNORE_UNEXPECTED_EOF-option.patch
404.html
50x.html
README.dynamic
UPGRADE-NOTES-1.6-to-1.10
macros.nginxmods.in
maxim.key
mdounin.key
nginx-1.20.1-CVE-2025-23419.patch
nginx-1.20.1.tar.gz
nginx-1.20.1.tar.gz.asc
nginx-logo.png
nginx-upgrade
nginx-upgrade.8
nginx.conf
nginx.logrotate
nginx.service
nginx.spec
nginx.sysusers
nginxmods.attr
sb.key
2324 blocks
展開が完了すると以下のようなファイルが出力されます。
パッチファイルを確認することで、どのような脆弱性が修正されているかを把握できます。
区分 | 主なファイル | 意味・活用 |
---|---|---|
パッチ群 | 000X-...patch , CVE-...patch |
セキュリティ修正の中身を確認、CVE対応可否の把握 |
ビルド制御 | nginx.spec , .service , .conf |
ビルドフローや初期設定、サービス構成の検証 |
ソース・署名・資料 | .tar.gz , .asc , README |
元のソースと変更差分を比較、パッケージ信頼性の担保 |
4. ソースコードを解凍する #
RPMを展開すると、ソースコードのアーカイブファイルとして .tar.gz や .tar.xz といった圧縮形式のソースコードが出力されることが一般的です。
これらのファイルは、パッケージに含まれるソフトウェアの元となるオリジナルのソースコードであり、通常は上流の開発元から提供されたものとなります。
tar.gz
の場合は以下のコマンドにて展開可能です。
tar xvf ファイル名
今回取得した nginx のファイルを展開する場合は以下となります。
tar xvf nginx-1.20.1.tar.gz
上記を実行すると「 nginx-1.20.1
」ディレクトリ内にnginxのソースコードが展開されます。
# ls -l nginx-1.20.1/
total 792
drwxr-xr-x. 6 1001 1001 4096 Jul 28 19:34 auto
-rw-r--r--. 1 1001 1001 311503 May 25 2021 CHANGES
-rw-r--r--. 1 1001 1001 475396 May 25 2021 CHANGES.ru
drwxr-xr-x. 2 1001 1001 168 Jul 28 19:34 conf
-rwxr-xr-x. 1 1001 1001 2590 May 25 2021 configure
drwxr-xr-x. 4 1001 1001 72 Jul 28 19:34 contrib
drwxr-xr-x. 2 1001 1001 40 Jul 28 19:34 html
-rw-r--r--. 1 1001 1001 1397 May 25 2021 LICENSE
drwxr-xr-x. 2 1001 1001 21 Jul 28 19:34 man
-rw-r--r--. 1 1001 1001 49 May 25 2021 README
drwxr-xr-x. 9 1001 1001 91 Jul 28 19:34 src
「 src
」ディレクトリを確認する事でソフトウェアのソースコードを確認する事が可能です。
パッチファイルの確認 #
RPMの展開にて出力された「 patch
」を確認する事でディストリビューション側で、そのRPMパッケージがどのような修正を受けているかをコードレベルで把握することができます。
とくにCVE番号が含まれるパッチは、既知の脆弱性への対応である可能性が高く、システムのセキュリティ評価において重要な指標となります。
以下のコマンドにてディレクトリ内のパッチファイル一覧を確認する事が可能です。
ls | grep ".patch"
今回取得したnginxでは以下の内容となっておりました。
# ls | grep ".patch"
0001-remove-Werror-in-upstream-build-scripts.patch
0002-fix-PIDFile-handling.patch
0003-Support-loading-cert-hardware-token-PKC.patch
0004-Set-proper-compiler-optimalization-level-O2-for-perl.patch
0005-Init-openssl-engine-properly.patch
0006-Fix-ALPACA-security-issue.patch
0007-Enable-TLSv1.3-by-default.patch
0008-CVE-2023-44487-HTTP-2-per-iteration-stream-handling.patch
0009-defer-ENGINE_finish-calls-to-a-cleanup.patch
0010-Optimized-chain-link-usage.patch
0011-CVE-2024-7347-Buffer-overread-in-the-mp4-module.patch
0012-CVE-2022-41741-and-CVE-2022-41742-fix.patch
0013-SSL-use-of-the-SSL_OP_IGNORE_UNEXPECTED_EOF-option.patch
nginx-1.20.1-CVE-2025-23419.patch
上記の一覧結果から、以下の 脆弱性(CVE) に対応した修正が含まれていることが読み取れます。
CVE番号 | 概要 |
---|---|
CVE-2023-44487 | HTTP/2のリクエスト乱用によるサービス拒否(DoS)攻撃 |
CVE-2024-7347 | MP4モジュールにおけるバッファオーバーリード |
CVE-2022-41741 | HTTP/2関連のセキュリティバイパス |
CVE-2025-23419 | セッション再開によるクライアント証明書認証要件の回避 |
より詳細な内容を確認したい場合は、上流で公開されている該当バージョンのソースコードと、パッチファイルの差分を比較することで、どのようなコード修正が行われたかを具体的に把握することが可能です。
- 脆弱性の発生箇所
- 修正によって追加・削除されたコード
- 処理の有無