メインコンテンツへスキップ
  1. ブログ/

【脆弱性確認】RPMファイルを展開してソースコードとパッチを確認する方法

·
Linux RPM セキュリティ AlmaLinux
目次

【AlmaLinux対応】RPMファイルを展開してソースコードとパッチを確認する方法
【AlmaLinux対応】RPMファイルを展開してソースコードとパッチを確認する方法

初めに
#

レットハット系のLinuxでは、「RPMファイル」という形式でソフトウェアが配布されています。

普段は dnfyum といったパッケージ管理ツールを利用しインストールするだけで済みますが、そのファイルにはソースコードやパッチファイルといった重要な情報が含まれています。

本記事では、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 ファイルが保存されます。

以下は先ほど取得した nginxrpm ファルとなります。

# 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ファルはアーカイブ形式になっているためダウンロードし、そのまま開いて中身を見ることはできません。

今回は以下の手順にて展開を行っていきます。

  1. 作業用ディレクトリの作成
  2. rpm2cpioコマンドにて変換
  3. cpioコマンドで展開
  4. ソースコードを解凍

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 セッション再開によるクライアント証明書認証要件の回避

より詳細な内容を確認したい場合は、上流で公開されている該当バージョンのソースコードと、パッチファイルの差分を比較することで、どのようなコード修正が行われたかを具体的に把握することが可能です。

  • 脆弱性の発生箇所
  • 修正によって追加・削除されたコード
  • 処理の有無

関連記事

【初心者向け解説】AlmaLinuxでOSバージョンを確認する方法
Linux コマンド AlmaLinux
【2025年7月29日更新】AlmaLinuxバージョン一覧まとめ
RHEL AlmaLinux Linux
【初心者向け解説】SELinuxの状態を確認する方法
Linux SELinux セキュリティ
AlmaLinux8でruby2.6以上をインストールする方法
Linux プログラム AlmaLinux
cyrus-sasl(サイラスサスル)とは
Linux セキュリティ
【簡単】Linuxでディレクトリを中身ごと削除する方法
Linux コマンド Rm Rmdir