Pokud je pro konkrétní software k dispozici oprava zabezpečení, obvykle provedeme binární upgrade pomocí nástrojů pro správu balíčků, jako je yum nebo apt-get.
Může však nastat situace, kdy jste nainstalovali software kompilací ze zdrojového kódu.
Jak v takové situaci použijete opravu zabezpečení na software?
Řešením je stáhnout bezpečnostní opravu a aplikovat ji na původní zdrojový kód a znovu zkompilovat software.
Tento tutoriál vysvětluje, jak vytvořit soubor opravy pomocí diff a použít jej pomocí příkazu patch.
Opravný soubor je textový soubor, který obsahuje rozdíly mezi dvěma verzemi stejného souboru (nebo stejného zdrojového stromu). Patch soubor je vytvořen pomocí příkazu diff.
1. Vytvořte soubor opravy pomocí diff
Abychom to pochopili, vytvořte malý program v C s názvem hello.c
#include <stdio.h> int main() { printf("Hello World\n"); }
Nyní zkopírujte hello.c do hello_new.c
$ cp hello.c hello_new.c
Upravte soubor hello_new.c, jak je uvedeno níže, abyste provedli několik malých změn:
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello World\n"); return 0; }
Nakonec vytvořte soubor opravy pomocí příkazu diff, jak je znázorněno níže:
$ diff -u hello.c hello_new.c > hello.patch
Výše uvedený příkaz vytvoří soubor opravy s názvem „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. Použijte soubor opravy pomocí příkazu Patch
Příkaz „patch“ bere jako vstup soubor opravy a aplikuje rozdíly na jeden nebo více původních souborů, čímž vytváří opravené verze.
patch -p[num] < patchfile patch [options] originalfile patchfile
Pomocí příkazu patch, jak je ukázáno níže, použijte hello.patch na původní zdrojový kód hello.c.
$ patch < hello.patch patching file hello.c
Soubor hello.patch obsahuje název souboru, který má být opraven. Jakmile bude soubor opraven, obsah bude mít hello.c i hello_new.c.
3. Vytvořte opravu ze stromu zdroje
Výše uvedený příklad byl tak jednoduchý, že funguje pouze s jedním souborem. Ukážeme si, jak vytvořit a aplikovat záplatu pro kompletní zdrojový strom na příkladu zdrojového kódu „openvpn“.
Stáhl jsem si 2 verze openvpn, openvpn-2.3.2 a openvpn-2.3.4.
tar -xvzf openvpn-2.3.2.tar.gz tar -xvzf openvpn-2.3.4.tar.gz
Nyní vytvoříme záplatu pomocí následujícího příkazu.
diff -Naur /usr/src/openvpn-2.3.2 /usr/src/openvpn-2.3.4 > openvpn.patch
Výše uvedený příkaz bude fungovat rekurzivně a najde rozdíly a umístí tyto rozdíly do souboru opravy.
4. Použijte soubor oprav na strom zdrojového kódu
Následující příkazy opravy lze použít k aplikaci opravy na zdrojový strom.
# 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 ...
Upozorňujeme, že příkaz provádíme z /usr/src/. Opravný soubor obsahuje všechny názvy souborů ve formátu absolutní cesty (od uživatele root). Takže když spustíme z /usr/src bez volby „-p“, nebude to fungovat správně.
-p3 říká příkazu patch, aby vynechal 3 úvodní lomítka z názvů souborů přítomných v souboru opravy. V našem případě je název souboru v souboru opravy „/usr/src/openvpn-2.3.2/aclocal.m4“, protože jste zadali „-p3“, 3 úvodní lomítka, tj. dokud /usr/src/ není ignorováno.
5. Před použitím opravy proveďte zálohu pomocí -b
Před použitím příkazu patch si můžete vytvořit zálohu původního souboru pomocí volby -b, jak je uvedeno níže.
$ patch -b < hello.patch patching file hello.c
Nyní budete mít název souboru „hello.c.orig“, což je záloha původního hello.c.
Můžete také použít -V k určení formátu souboru zálohy, jak je uvedeno níže. Nyní budete mít název souboru „hello.c.~1~“.
$ patch -b -V numbered < hello.patch patching file hello.c
6. Ověřte opravu bez použití (soubor opravy spusťte nasucho)
Příkaz patch můžete nasucho spustit, abyste zjistili, zda se neobjevují nějaké chyby, aniž byste museli soubor opravovat pomocí možnosti –dry-run, jak je uvedeno níže.
$ patch --dry-run < hello.patch patching file hello.c
Vidíte, že hello.c není vůbec upraveno.
7. Vrácení opravy, která je již použita (Vrácení opravy)
Můžete použít volbu -R ke zrušení opravy, která je již aplikována.
$ 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
Z velikosti souboru si můžete všimnout, že patch, který je již aplikován, je obrácený, když jsme použili volbu -R.