Isaac Kuri

Reseñas, guias y articulos

  • Al momento de mantener proyectos con npm, yarn o pnpm, las vulnerabilidades suelen ser un aspecto ignorado en el ciclo de mantenimiento de software. Debido a esto, al momento de mitigar vulnerabilidades, acabamos en situaciones donde el software está plagado de vulnerabilidades y, en casos muy drásticos, puede volverse un refactor-hell debido al code-debt que esto causa.

    Las impliaciones de tener vulnerabilidades son varias, entre ellas:

    • Vulnerar usuarios de tu software, por medio de malware, troyanos o remote-code-execution.
    • Filtraciones de datos.
    • Pérdida de confianza de parte de usuarios e inversionistas.
    • Compromiso de tu infraestructura, por ejemplo, backdoors, DNS hijacks, filtración de tokens, etc.

    Todo esto puede ser evitado con buenas practicas de programacion y conocimiento de herramientas que nos incluye nuestros package-manager.

    Dando un ejemplo práctico con UELI: https://github.com/oliverschwendener/ueli, que es un lanzador de teclas. Estos son los comandos que utilizaremos y están disponibles en todos los package managers.

    • npm list: Provee una lista de los paquetes instalados en nuestro proyecto.
    • npm audit: Provee una explicación detallada de las vulnerabilidades presentes en el proyecto.
    • npm why <package>: Provee una visualización de qué está requiriendo este paquete.
    • npm audit fix: Realiza las actualizaciones de seguridad que no contengan breaking-changes.
    • npm audit fix –force: Realiza breaking-changes, asumiendo que tú, como desarrollador, implementarás los cambios necesarios para que el programa funcione.

    Ejemplo práctico

    Empezamos utilizando npm install para instalar las dependencias de UELI.

     >  npm install
    added 597 packages, and audited 598 packages in 28s
    
    109 packages are looking for funding
      run `npm fund` for details
    
    2 high severity vulnerabilities
    
    To address all issues, run:
      npm audit fix
    
    Run `npm audit` for details.

    Inmediatamente observamos que se nos reportan 2 vulnerabilidades de serveridad high.

    Las vulnerabilidades se clasifican en Critical > High > Medium > Low. Una vulnerabilidad crítica usualmente implica remote-code-execution, CISA KEV, infostealers, etc., y debe ser mitigada y resuelta en menos de 48 horas. Severidad high, suelen tener una índole similar, pero por lo general comprometen al servicio, como permitir DDoS. Medium y Low suelen darse plazos de 1-2 meses para solucionarlos, ya que son más difíciles de explotar o bajo condiciones muy específicas.

    Ahora utilizaremos npm audit para ver de qué forma nos están vulnerando.

     >  npm audit
    # npm audit report
    
    react-router  7.0.0 - 7.14.2
    Severity: high
    React Router vulnerable to DoS via unbounded path expansion in __manifest endpoint - https://github.com/advisories/GHSA-8x6r-g9mw-2r78
    fix available via `npm audit fix`

    Vemos que tenemos un caso de Denial of Service (DoS) que es típico de una vulnerabilidad de severidad alta. Y se nos indica que puede ser resuelta de forma automática utilizando npm audit fix.

    Antes de eso, utilicemos npm why react-router-dom, para ver el origen de este paquete. Recomiendo hacer esto, ya que en proyectos de muchos años es posible que estemos acarreando paquetes que no utilizamos ya.

     >  npm why react-router-dom
    [email protected]
    node_modules/react-router-dom
      react-router-dom@"^7.12.0" from the root project

    Obviamente, esto es parte del core de React y tenemos que conservarlo. Entonces vamos a resolver la vulnerabilidad utilizando npm audit fix.

     >  npm audit fix
    
    changed 2 packages, and audited 598 packages in 3s
    
    109 packages are looking for funding
      run `npm fund` for details
    
    found 0 vulnerabilities

    Con esto hemos resuelto las vulnerabilidades en UELI. 🥳

    Después de este proceso, recuerda revisar tu build y correr tus tests para verificar que todo esté en orden.

    Build:

     >  npm run build
    
    > [email protected] build
    > vite build
    
    vite v8.0.10 building client environment for production...
    ✓ 2340 modules transformed.
    computing gzip size...
    dist-renderer/settings.html                    1.17 kB │ gzip:   0.49 kB
    dist-renderer/search.html                      1.19 kB │ gzip:   0.50 kB
    dist-renderer/assets/search-9LK6AzB7.js       53.03 kB │ gzip:  18.81 kB
    dist-renderer/assets/settings-Qma3fLX6.js    119.58 kB │ gzip:  30.70 kB
    dist-renderer/assets/client-Fp6Dr0P0.js    1,006.29 kB │ gzip: 279.51 kB
    
    ✓ built in 441ms
    vite v8.0.10 building client environment for production...
    ✓ 515 modules transformed.
    computing gzip size...
    dist-main/createEmptyInstantSearchResult-BXd1XI1b.js    0.65 kB │ gzip:  0.37 kB
    dist-main/index.js                                      2.92 kB │ gzip:  0.94 kB
    dist-main/Core-DQyQ8j0k.js                             76.06 kB │ gzip: 18.80 kB
    dist-main/Extensions-BbrEHj29.js                      157.96 kB │ gzip: 38.01 kB
    
    ✓ built in 68ms
    vite v8.0.10 building client environment for production...
    ✓ 2 modules transformed.
    computing gzip size...
    dist-preload/index.js  3.20 kB │ gzip: 0.77 kB
    
    ✓ built in 12ms

    Tests:

    
      >  npm run test
    
    > [email protected] test
    > vitest run
    
     RUN  v4.1.5 /home/isaac/repositories/ueli/srcTest Files  149 passed (149)
          Tests  697 passed (697)
       Start at  20:26:11
       Duration  2.37s (transform 19.98s, setup 0ms, import 27.96s, tests 1.23s, environment 11ms)
    
    

    Dependabot

    Cabe mencionar que una herramienta para estar al día es Dependabot, que automáticamente provee de PRs en tus repositorios que mitigan vulnerabilidades que pueden ser resueltas sin cambios al código. El repositorio de UELI tiene Dependabot implementado y se refleja en el bajo número de vulnerabilidades que encontramos; ¡por lo general, los proyectos pueden llegar a tener cientos de vulnerabilidades!

    Revisa los PRs para verlo en acción: https://github.com/oliverschwendener/ueli/pull/1523 (Aquí se está solucionando la vulnerabilidad del artículo).

    Aprende más sobre Dependabot aquí: https://docs.github.com/en/code-security/tutorials/secure-your-dependencies/dependabot-quickstart

    Glosario

    • code-debt: Es el costo futuro oculto de rehacer el trabajo debido a la elección de soluciones de software rápidas a corto plazo en lugar de las óptimas a largo plazo. Al igual que la deuda financiera, acumula “intereses”, haciendo que el desarrollo futuro sea más lento y costoso si los atajos no se corrigen con el tiempo.
    • refactor: Es el proceso de reestructurar el código existente para mejorar su diseño interno y legibilidad sin alterar su comportamiento externo. Es la herramienta clave para pagar los “intereses” de la deuda técnica, transformando soluciones improvisadas en código limpio, mantenible y preparado para el futuro.
    • breaking-changes: Cambios en dependencias que requieren intervencion del desarollador. Por ejemplo cambio en interfaces y parametros de funciones que son parte del paquete.

    + ,
  • Esta es una guía escrita acerca de cómo instalar Pterodactyl y Blueprint utilizando el script de instalación “Pterodactyl Installer”; asumo que el lector tiene algunos conocimientos básicos de redes y Linux.

    Este post está basado en este video y recomiendo ampliamente verlo, incluso subtitulado, para que vean el proceso. Yo simplemente lo he resumido en texto para que sea conveniente y agregué los pasos para instalar Blueprint.

    Conocimientos previos

    • Conocimientos basicos sobre como instalar y conectarse a Ubuntu Server 24 LTS por medio de SSH.

    Requisitos previos

    • IP local fija en la máquina.
    • Registro DNS local para el dominio FQDN. Esto se puede conseguir con firewalls como OPNSense, PFsense, etc.

    Instrucciones para el Panel y Wings

    1. Instalar Ubuntu Server 24 LTS.
    2. Acceder como root: sudo -i.
    3. Ejecutar el instalador: bash <(curl -s https://pterodactyl-installer.se)
      1. Selecciona la opción 2 para instalar tanto el Panel como Wings.
      2. Rechaza las opciones de SSL y reglas de firewall (si es para uso local).
      3. Configura un dominio FQDN único y válido.
      4. Usa los nombres por defecto para la base de datos por conveniencia.
    4. Finalizar instalación.
    5. Configuración inicial:
      1. Abre el panel en tu navegador usando http://tu-dominio-FQDN
      2. Configura una “Location” (Ubicación).
      3. Configura el “Node” (Nodo) usando el mismo FQDN del panel como URL.
    6. Configurar Wings:
      1. Ve a la terminal de root y copia el código generado en el panel para configurar Wings.
      2. Habilita el servicio: sudo systemctl enable wings
      3. Inicia el servicio: sudo systemctl start wings
      4. Verifica que todo funcione: sudo systemctl status wings

    Instalación de Blueprint

    1. Actualizar definiciones: sudo apt update.
    2. Instalar dependencias: apt install -y zip unzip git curl wget.
    3. Instalar NodeJS
      1. curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
      2. sudo apt install -y nodejs
    4. Instalar Yarn globalmente: sudo npm i -g yarn.
    5. Iniciar Yarn en la carpeta de Pterodactyl: cd /var/www/pterodactyl && sudo yarn
    6. Descargar Blueprint
      • cd ~ && wget "$(curl -s https://api.github.com/repos/BlueprintFramework/framework/releases/latest | grep 'browser_download_url' | cut -d '"' -f 4)" -O release.zip
    7. Instalar archivos (selecciona “replace All” si lo pregunta).
      • sudo mv release.zip /var/www/pterodactyl/release.zipcd /var/www/pterodactyl && sudo unzip release.zip
    8. Configuración básica: touch /var/www/pterodactyl/.blueprintrc
    9. ⚠️Esto es importante, llena el archivo con la configuración básica que puse abajo⚠️
    10. Ejecutar instalador: sudo chmod +x blueprint.sh && sudo bash blueprint.sh

    Configuración básica de Blueprint

    PASO 9: Ejecuta esto para colocar la configuración básica en el archivo .blueprintrc:

    Bash

    echo \
    'WEBUSER="www-data";
    OWNERSHIP="www-data:www-data";
    USERSHELL="/bin/bash";' >> /var/www/pterodactyl/.blueprintrc

    Tips / Consejos

    • Usa siempre sudo -i: Ubuntu requiere permisos de root para casi todas las operaciones relacionadas con el panel.
    • Transferencia de archivos: Usa FileZilla mediante SSH para enviar tus archivos de Blueprint.
    • Instalar extensiones: Mueve los archivos .blueprint a /var/www/pterodactyl y ejecuta:sudo blueprint -install nombre_extension.blueprint.
    • Exponer los servidores al exterior: Una solución sencilla es utilizar playit.gg siempre y cuando tengas un tunnel agent dentro del mismo rango de red.

    Desinstalación ⚠️

    Eliminar Panel y/o Wings:

    1. Ejecuta: bash <(curl -s https://pterodactyl-installer.se)
    2. Selecciona la opción 6.
    3. Sigue las instrucciones; permite desinstalar solo el panel, solo las wings o ambos.

    Limpieza total de Base de Datos (DB Nuke):

    Usa este script si necesitas borrar todo rastro de SQL para reiniciar el proceso desde cero:

    Bash

    set -e
    echo "==> Deteniendo MySQL/MariaDB..."
    sudo systemctl stop mysql || true
    sudo systemctl stop mariadb || true
    echo "==> Deshabilitando servicios..."
    sudo systemctl disable mysql || true
    sudo systemctl disable mariadb || true
    echo "==> Eliminando paquetes y librerías..."
    sudo apt-get update -y
    sudo apt-get purge -y 'mysql-*' 'mariadb-*' 'percona-server*' 'galera-*' 'libmysql*' 'libmariadb*' || true
    sudo apt-get autoremove -y --purge
    sudo apt-get autoclean -y
    echo "==> Eliminando directorios de datos y configuración..."
    sudo rm -rf /var/lib/mysql
    sudo rm -rf /etc/mysql
    sudo rm -rf /var/log/mysql /var/log/mysql.*
    sudo rm -rf /var/run/mysqld
    echo "==> Liberando puerto 3306..."
    sudo ss -ltnp | grep ':3306' || echo "Puerto libre."
    echo "==> Proceso completado."

    Referencias

    + ,
  • Después de pensar bastante en qué plataforma realizaría mi blog personal, WordPress.com es una plataforma que anteriormente ya había utilizado y encontraba mucha facilidad al momento de hacer posts y formatos escritos, así que en vez de programar algo de cero, como sería propio de mí, tomé la decisión de utilizar una plataforma.

    Tengo mucho que configurar, como el estilo y qué template usaré a final de cuentas. Así que de momento esto es un WIP.

    La idea general es tener un lugar fijo para publicar guías escritas, reseñas y alguna que otra cosa interesante de la cual quiera escribir.

    Mi CV se migró a https://cv.isaackuri.com, el cual necesita algunas actualizaciones aún.

    Veamos qué tan lejos puedo llevar este sitio web. 😄

    -Isaac Kuri-

    +