Cuando hay una solución de seguridad disponible para un software en particular, generalmente hacemos una actualización binaria usando las herramientas de administración de paquetes como yum o apt-get.
Pero, puede haber una situación en la que haya instalado un software compilándolo desde el código fuente.
En esa situación, ¿cómo se aplica la solución de seguridad al software?
La respuesta es descargar el parche de seguridad y aplicarlo al código fuente original y volver a compilar el software.
Este tutorial explica cómo crear un archivo de parche usando diff y aplicarlo usando el comando patch.
Un archivo de parche es un archivo de texto que contiene las diferencias entre dos versiones del mismo archivo (o del mismo árbol fuente). El archivo de parche se crea usando el comando diff.
1. Crear un archivo de parche usando diff
Para entender esto, creemos un pequeño programa en C llamado hello.c
#include <stdio.h> int main() { printf("Hello World\n"); }
Ahora, copia hello.c a hello_new.c
$ cp hello.c hello_new.c
Edite hello_new.c como se muestra a continuación para realizar algunos pequeños cambios:
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello World\n"); return 0; }
Finalmente, cree el archivo de parche usando el comando diff como se muestra a continuación:
$ diff -u hello.c hello_new.c > hello.patch
El comando anterior creará un archivo de parche llamado "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. Aplicar archivo de parche usando el comando de parche
El comando "patch" toma un archivo de parche como entrada y aplica las diferencias a uno o más archivos originales, produciendo versiones parcheadas.
patch -p[num] < patchfile patch [options] originalfile patchfile
Utilice el comando de parche como se muestra a continuación para aplicar hello.patch al código fuente original de hello.c.
$ patch < hello.patch patching file hello.c
El archivo hello.patch contiene el nombre del archivo que se va a parchar. Una vez que el archivo esté parcheado, tanto hello.c como hello_new.c tendrán el contenido.
3. Crear un parche a partir de un árbol de fuentes
El ejemplo anterior era tan simple que solo funciona con un archivo. Veremos cómo crear y aplicar un parche para un árbol fuente completo tomando como ejemplo el código fuente "openvpn".
He descargado 2 versiones de openvpn, openvpn-2.3.2 y openvpn-2.3.4.
tar -xvzf openvpn-2.3.2.tar.gz tar -xvzf openvpn-2.3.4.tar.gz
Ahora crearemos el parche usando el siguiente comando.
diff -Naur /usr/src/openvpn-2.3.2 /usr/src/openvpn-2.3.4 > openvpn.patch
El comando anterior operará recursivamente y encontrará las diferencias, y colocará esas diferencias en el archivo de parche.
4. Aplicar archivo de parche a un árbol de código fuente
Los siguientes comandos de parche se pueden usar para aplicar el parche al árbol fuente.
# 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 ...
Tenga en cuenta que estamos ejecutando el comando desde /usr/src/. El archivo de parche contiene todos los nombres de archivo en formato de ruta absoluta (desde la raíz). Entonces, cuando ejecutamos desde /usr/src, sin la opción "-p", no funcionará correctamente.
-p3 le dice al comando de parche que omita 3 barras inclinadas iniciales de los nombres de archivo presentes en el archivo de parche. En nuestro caso, el nombre de archivo en el archivo de parche es "/usr/src/openvpn-2.3.2/aclocal.m4", ya que ha dado "-p3", 3 barras inclinadas, es decir, hasta que se ignore /usr/src/.
5. Realice una copia de seguridad antes de aplicar el parche usando -b
Puede realizar una copia de seguridad del archivo original antes de aplicar el comando de parche usando la opción -b como se muestra a continuación.
$ patch -b < hello.patch patching file hello.c
Ahora tendrá un nombre de archivo "hello.c.orig", que es la copia de seguridad del hello.c original.
También puede usar -V para decidir el formato del nombre del archivo de respaldo como se muestra a continuación. Ahora tendrá un nombre de archivo "hello.c.~1~".
$ patch -b -V numbered < hello.patch patching file hello.c
6. Valide el parche sin aplicar (archivo de parche de ejecución en seco)
Puede ejecutar en seco el comando de parche para ver si obtiene algún error, sin parchear el archivo usando la opción de ejecución en seco como se muestra a continuación.
$ patch --dry-run < hello.patch patching file hello.c
Puede ver que hello.c no se modifica en absoluto.
7. Revertir un parche que ya se aplicó (deshacer un parche)
Puede usar la opción -R para revertir un parche que ya se aplicó.
$ 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
Puede notar en el tamaño del archivo que el parche, que ya está aplicado, se invierte cuando usamos la opción -R.