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コマンド等で、差分対象のファイルを指定してエラーならないか確認すればいいと思います。

 

スポンサーリンク