pacthコマンドの当て方・適用方法(Linux)
Patchの当て方・適用の仕方
Apacehの脆弱性の関係でPatchを当てたのですが、久しぶりにPatchコマンドを使うと「–p」のオプションの使い方が忘れていたので備忘録としてメモしておきます
Patchの「-p」のオプションについて
patchコマンドはオリジナルファイルに差分ファイルを適用するコマンドです。差分を適用することで脆弱性等の対策したファイルとして脆弱性の対応します。
このパッチを当てる際によく使うオプションの「-p」にオプションをよく使います。
オプションをmanページで確認すると下記のようになっていますがわかりにくいですが、パッチコマンドの叩く階層から「-pnum」で指定した階層を何回層省略するかを指定する時に使います
少しわかりにくいので、サンプルのパッチファイルを確認しながら説明します
-pnum または –strip=num
パッチファイルで見つかったファイル名それぞれについて、num個のスラッシュを含む最小のプレフィクスを取り除く。
隣接した1個または複数のスラッシュの並びは 1 個のスラッシュとして数えられる。
このオプションはパッチを送った人と異なるディレクトリにファイルを格納している場合のために、パッチファイル中のファイル名の扱いを変更する。
patchコマンドを実行する位置からpatchを適用するファイルの場所を指定する際に使用します。実際にApacehのパッチを当てる時の手順で説明します
まずはパッチを当てるApacheのファイルとPatchファイルをダウンロードします。
$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//httpd/httpd-2.2.32.tar.gz $ wget http://ftp.riken.jp/net/apache//httpd/patches/apply_to_2.2.32/CVE-2017-3167.patch
Apacheは解凍して、Patchファイルは、中身を確認します
$ tar xzvf httpd-2.2.32.tar.gz $ more CVE-2017-3167.patch Merge https://svn.apache.org/r1796348 from trunk: *) SECURITY: CVE-2017-3167 (cve.mitre.org) Use of the ap_get_basic_auth_pw() by third-party modules outside of the authentication phase may lead to authentication requirements being bypassed. [Emmanuel Dreyfus , Jacob Champion, Eric Covener] Submitted By: Emmanuel Dreyfus , Jacob Champion, Eric Coven er Reviewed By: covener, ylavic, wrowe diff --git include/ap_mmn.h include/ap_mmn.h index ce330a5..fcbce6f 100644 --- include/ap_mmn.h +++ include/ap_mmn.h @@ -167,6 +167,8 @@ * and ap_scan_vchar_obstext() * Replaced fold boolean with with multiple bit flags * to ap_[r]getline()
中身を確認すると「diff –git include/ap_mmn.h include/ap_mmn.h」と記述があります。この「ap_mmn.h」というファイルに差分を適用します。
このpatchファイルではそのファイルのパスは「include/ap_mmn.h include/ap_mmn.h」となります。
Apacheを解答してできたディレクトリは階層は以下のようになります。
$ ls httpd-2.2.32 ABOUT_APACHE LICENSE ROADMAP docs libhttpd.dsp Apache.dsw Makefile.in VERSIONING emacs-style libhttpd.mak BuildAll.dsp Makefile.win acinclude.m4 httpd.dep modules BuildBin.dsp NOTICE build httpd.dsp os CHANGES NWGNUmakefile buildconf httpd.mak server INSTALL README config.layout httpd.spec srclib InstallBin.dsp README-win32.txt configure include support LAYOUT README.platforms configure.in libhttpd.dep test $ ls -l httpd-2.2.32/include/ap_mmn.h -rw-r--r-- 1 ex-adm ex-adm 10764 1月 5 10:57 httpd-2.2.32/include/ap_mmn.h
「ap_mmn.h」は「httpd-2.2.32/include/ap_mmn.h」の箇所にあるので、パッチを適用する場合は「httpd-2.2.32/」に移動してパッチコマンド「patch -p0 < ../CVE-2017-3167.patch」と叩けばOKです
「-p0」とオプションを付けていますが、「/」の位置は変更しなくても差分を適用できるので「-p0」となります。
$ cd httpd-2.2.32/ $ patch -p0 < ../CVE-2017-3167.patch patching file include/ap_mmn.h patching file include/http_protocol.h patching file server/protocol.c patching file server/request.c $ ls include/ap_mmn.h include/ap_mmn.h
patchコマンドで「-p1」のオプションを使用する場合
「-p1」となる場合は、パッチファイルの中身を確認して説明します。下記のパッチファイルですがqmailのパッチファイルです。
中身を確認するとqmailのソースを解答したディレクトリに移動して「patch -s -p1 < patch-to-patch-file」となっています。これは差分ファイルが「qmail-1.03.orig/date822fmt.c」とqmailソースディレクトリのバージョンを含んでいたり「qmail-1.03.orig」のようにバックアップ用途のディレクトリ名になっているので、「/」の位置を1個取り除く必要があるためです。
To apply this patch, cd into the qmail source directory and type…
patch -s -p1 < patch-to-patch-file
$ wget http://qmail.teraren.com/qmail-1.03.tar.gz $ more qmail-date-localtime.patch To apply this patch, cd into the qmail source directory and type... patch -s -p1 < patch-to-patch-file --- qmail-1.03.orig/date822fmt.c Tue Apr 15 15:05:23 1997 +++ qmail-1.03/date822fmt.c Fri Apr 18 00:39:41 1997 @@ -1,3 +1,4 @@ +#include <time.h> #include "datetime.h"
「-p1」とすることで、「qmail-1.03.orig/date822fmt.c 」の場合は「qmail-1.03.orig」を取り除き、「date822fmt.c 」となります。「qmail-1.03/date822fmt.c 」の場合は「qmail-1.03」を取り除き、「date822fmt.c」となります。
こちらもわかりにくい場合はlsコマンド等で、差分対象のファイルを指定してエラーならないか確認すればいいと思います。
ディスカッション
コメント一覧
まだ、コメントがありません