Ketika ada perbaikan keamanan yang tersedia untuk software tertentu, kami biasanya melakukan upgrade biner menggunakan alat manajemen paket seperti yum atau apt-get.
Namun, mungkin ada situasi di mana Anda telah menginstal perangkat lunak dengan mengompilasinya dari kode sumber.
Dalam situasi tersebut, bagaimana Anda menerapkan perbaikan keamanan pada perangkat lunak?
Jawabannya adalah mengunduh patch keamanan dan menerapkannya ke kode sumber asli dan mengkompilasi ulang perangkat lunak.
Tutorial ini menjelaskan cara membuat file patch menggunakan diff, dan menerapkannya menggunakan perintah patch.
File patch adalah file teks yang berisi perbedaan antara dua versi dari file yang sama (atau source-tree yang sama). File patch dibuat dengan menggunakan perintah diff.
1. Buat File Patch menggunakan diff
Untuk memahami ini, mari kita buat program C kecil bernama hello.c
#include <stdio.h> int main() { printf("Hello World\n"); }
Sekarang, salin hello.c ke hello_new.c
$ cp hello.c hello_new.c
Edit hello_new.c seperti yang ditunjukkan di bawah ini untuk membuat beberapa perubahan kecil:
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello World\n"); return 0; }
Terakhir, buat file patch menggunakan perintah diff seperti yang ditunjukkan di bawah ini:
$ diff -u hello.c hello_new.c > hello.patch
Perintah di atas akan membuat file patch bernama “hello.patch”.
--- hello.c 2014-10-07 18:17:49.000000000 +0530 +++ hello_new.c 2014-10-07 18:17:54.000000000 +0530 @@ -1,5 +1,6 @@ #include <stdio.h> -int main() { +int main(int argc, char *argv[]) { printf("Hello World\n"); + return 0; }
2. Terapkan File Patch menggunakan Perintah Patch
Perintah "patch" mengambil file patch sebagai input dan menerapkan perbedaannya ke satu atau beberapa file asli, menghasilkan versi yang ditambal.
patch -p[num] < patchfile patch [options] originalfile patchfile
Gunakan perintah patch seperti yang ditunjukkan di bawah ini untuk menerapkan hello.patch ke kode sumber hello.c asli.
$ patch < hello.patch patching file hello.c
File hello.patch berisi nama file yang akan ditambal. Setelah file ditambal, hello.c dan hello_new.c akan memiliki konten.
3. Buat Patch Dari Pohon Sumber
Contoh di atas sangat sederhana sehingga hanya berfungsi dengan satu file. Kita akan melihat cara membuat dan menerapkan patch untuk struktur sumber lengkap dengan mengambil kode sumber “openvpn” sebagai contoh.
Saya telah mengunduh 2 versi openvpn, openvpn-2.3.2 dan openvpn-2.3.4.
tar -xvzf openvpn-2.3.2.tar.gz tar -xvzf openvpn-2.3.4.tar.gz
Sekarang kita akan membuat patch menggunakan perintah berikut.
diff -Naur /usr/src/openvpn-2.3.2 /usr/src/openvpn-2.3.4 > openvpn.patch
Perintah di atas akan beroperasi secara rekursif dan menemukan perbedaannya, dan menempatkan perbedaan tersebut di file patch.
4. Terapkan File Patch ke Pohon Kode Sumber
Perintah tambalan berikut dapat digunakan untuk menerapkan tambalan ke pohon sumber.
# patch -p3 < /root/openvpn.patch patching file openvpn-2.3.2/aclocal.m4 patching file openvpn-2.3.2/build/Makefile.in patching file openvpn-2.3.2/build/msvc/Makefile.in ...
Harap dicatat bahwa kami menjalankan perintah dari /usr/src/. File patch berisi semua nama file dalam format path absolut (dari root). Jadi ketika kita mengeksekusi dari /usr/src, tanpa opsi “-p”, itu tidak akan bekerja dengan baik.
-p3 memberitahu perintah patch untuk melewati 3 garis miring dari nama file yang ada di file patch. Dalam kasus kami, nama file dalam file patch adalah "/usr/src/openvpn-2.3.2/aclocal.m4", karena Anda telah memberikan "-p3", 3 garis miring, yaitu sampai /usr/src/ diabaikan.
5. Ambil Cadangan sebelum Menerapkan Patch menggunakan -b
Anda dapat mengambil cadangan file asli sebelum menerapkan perintah patch menggunakan opsi -b seperti yang ditunjukkan di bawah ini.
$ patch -b < hello.patch patching file hello.c
Sekarang Anda akan memiliki nama file "hello.c.orig", yang merupakan cadangan dari hello.c.
Anda juga dapat menggunakan -V untuk menentukan format nama file cadangan seperti yang ditunjukkan di bawah ini. Sekarang Anda akan memiliki nama file “hello.c.~1~”.
$ patch -b -V numbered < hello.patch patching file hello.c
6. Validasi Patch tanpa Menerapkan (Dry-run Patch File)
Anda dapat menjalankan perintah patch kering untuk melihat apakah Anda mendapatkan kesalahan, tanpa menambal file menggunakan opsi –dry-run seperti yang ditunjukkan di bawah ini.
$ patch --dry-run < hello.patch patching file hello.c
Anda dapat melihat bahwa hello.c tidak dimodifikasi sama sekali.
7. Membalikkan Patch yang Sudah Diterapkan (Undo a Patch)
Anda dapat menggunakan opsi -R untuk membalikkan patch yang sudah diterapkan.
$ patch < hello.patch patching file hello.c $ ls -l hello.c -rw-r--r-- 1 lakshmanan users 94 2014-10-07 20:05 hello.c $ patch -R < hello.patch patching file hello.c $ ls -l hello.c -rw-r--r-- 1 lakshmanan users 62 2014-10-07 20:04 hello.c
Anda dapat melihat dari ukuran file, bahwa patch yang diterapkan sudah dibalik ketika kami menggunakan opsi -R.