Quando è disponibile una correzione di sicurezza per un particolare software, in genere eseguiamo un aggiornamento binario utilizzando gli strumenti di gestione dei pacchetti come yum o apt-get.
Tuttavia, potrebbe esserci una situazione in cui hai installato un software compilandolo dal codice sorgente.
In queste situazioni, come si applica la correzione di sicurezza al software?
La risposta è scaricare la patch di sicurezza e applicarla al codice sorgente originale e ricompilare il software.
Questo tutorial spiega come creare un file di patch usando diff e applicarlo usando il comando patch.
Un file di patch è un file di testo che contiene le differenze tra due versioni dello stesso file (o dello stesso albero dei sorgenti). Il file di patch viene creato utilizzando il comando diff.
1. Crea un file di patch usando diff
Per capirlo, creiamo un piccolo programma C chiamato hello.c
#include <stdio.h> int main() { printf("Hello World\n"); }
Ora copia hello.c in hello_new.c
$ cp hello.c hello_new.c
Modifica hello_new.c come mostrato di seguito per apportare alcune piccole modifiche:
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello World\n"); return 0; }
Infine, crea il file della patch usando il comando diff come mostrato di seguito:
$ diff -u hello.c hello_new.c > hello.patch
Il comando precedente creerà un file di patch chiamato "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. Applica il file di patch utilizzando il comando Patch
Il comando "patch" prende un file di patch come input e applica le differenze a uno o più file originali, producendo versioni con patch.
patch -p[num] < patchfile patch [options] originalfile patchfile
Usa il comando patch come mostrato di seguito per applicare hello.patch al codice sorgente hello.c originale.
$ patch < hello.patch patching file hello.c
Il file hello.patch contiene il nome del file da correggere. Una volta che il file è stato corretto, sia hello.c che hello_new.c avranno il contenuto.
3. Crea una patch da un albero di origine
L'esempio sopra era così semplice che funziona solo con un file. Vedremo come creare e applicare patch per un albero completo dei sorgenti prendendo come esempio il codice sorgente “openvpn”.
Ho scaricato la versione 2 di openvpn, openvpn-2.3.2 e openvpn-2.3.4.
tar -xvzf openvpn-2.3.2.tar.gz tar -xvzf openvpn-2.3.4.tar.gz
Ora creeremo la patch usando il seguente comando.
diff -Naur /usr/src/openvpn-2.3.2 /usr/src/openvpn-2.3.4 > openvpn.patch
Il comando precedente funzionerà in modo ricorsivo e troverà le differenze e le posizionerà nel file di patch.
4. Applica il file di patch a un albero del codice sorgente
I seguenti comandi di patch possono essere usati per applicare la patch all'albero dei sorgenti.
# 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 ...
Tieni presente che stiamo eseguendo il comando da /usr/src/. Il file di patch contiene tutti i nomi di file in formato di percorso assoluto (da root). Quindi, quando eseguiamo da /usr/src, senza l'opzione "-p", non funzionerà correttamente.
-p3 dice al comando patch di saltare 3 barre iniziali dai nomi di file presenti nel file di patch. Nel nostro caso, il nome del file nel file di patch è “/usr/src/openvpn-2.3.2/aclocal.m4”, poiché hai dato “-p3”, 3 barre iniziali, cioè finché /usr/src/ non viene ignorato.
5. Eseguire un backup prima di applicare la patch utilizzando -b
Puoi fare un backup del file originale prima di applicare il comando patch usando l'opzione -b come mostrato di seguito.
$ patch -b < hello.patch patching file hello.c
Ora avrai un nome file "hello.c.orig", che è il backup dell'originale hello.c.
Puoi anche usare -V per decidere il formato del nome del file di backup come mostrato di seguito. Ora avrai un nome file "ciao.c.~1~".
$ patch -b -V numbered < hello.patch patching file hello.c
6. Convalida la patch senza applicarla (file patch eseguito a secco)
Puoi eseguire a secco il comando patch per vedere se stai ricevendo errori, senza correggere il file usando l'opzione –dry-run come mostrato di seguito.
$ patch --dry-run < hello.patch patching file hello.c
Puoi vedere che hello.c non è affatto modificato.
7. Annulla una patch già applicata (Annulla una patch)
Puoi usare l'opzione -R per annullare una patch già applicata.
$ 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
Puoi notare dalla dimensione del file che la patch, che è già applicata, è invertita quando abbiamo usato l'opzione -R.