<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SAUL JOSE ALVARADO URBANO</title>
    <description>The latest articles on DEV Community by SAUL JOSE ALVARADO URBANO (@saul_josealvaradourbano).</description>
    <link>https://dev.to/saul_josealvaradourbano</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4164159%2Fda645853-7dd5-4229-829c-8fac7e668dcf.png</url>
      <title>DEV Community: SAUL JOSE ALVARADO URBANO</title>
      <link>https://dev.to/saul_josealvaradourbano</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saul_josealvaradourbano"/>
    <language>en</language>
    <item>
      <title>Implementación de DevSecOps con Bearer SAST y GitHub Actions: De la Detección a la Remediación</title>
      <dc:creator>SAUL JOSE ALVARADO URBANO</dc:creator>
      <pubDate>Mon, 05 Oct 2026 15:25:50 +0000</pubDate>
      <link>https://dev.to/saul_josealvaradourbano/implementacion-de-devsecops-con-bearer-sast-y-github-actions-de-la-deteccion-a-la-remediacion-16k</link>
      <guid>https://dev.to/saul_josealvaradourbano/implementacion-de-devsecops-con-bearer-sast-y-github-actions-de-la-deteccion-a-la-remediacion-16k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Autor:&lt;/strong&gt; Saúl Jose Alvarado Urbano &lt;br&gt;
&lt;strong&gt;Autor:&lt;/strong&gt; Ana Cecilia Esteban Ramos&lt;br&gt;
&lt;strong&gt;Repositorio:&lt;/strong&gt; &lt;a href="https://github.com/saulalvarado1/Bearer_Articulo" rel="noopener noreferrer"&gt;github.com/saulalvarado1/Bearer_Articulo&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;API en Vivo:&lt;/strong&gt; &lt;a href="https://bearer-articulo.onrender.com" rel="noopener noreferrer"&gt;bearer-articulo.onrender.com&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Resumen (Abstract)
&lt;/h2&gt;

&lt;p&gt;En el desarrollo de software moderno, la seguridad ya no puede ser una fase tardía o una auditoría aislada antes del lanzamiento a producción. El paradigma &lt;strong&gt;Shift-Left&lt;/strong&gt; propone integrar la seguridad desde las primeras etapas del ciclo de vida del desarrollo de software (SSDLC). &lt;/p&gt;

&lt;p&gt;En este artículo técnico presentamos la implementación práctica de un flujo &lt;strong&gt;DevSecOps&lt;/strong&gt; completo para una API REST construida con &lt;strong&gt;Node.js&lt;/strong&gt; y &lt;strong&gt;Express&lt;/strong&gt;. Configuramos un pipeline de Integración Continua (CI) en &lt;strong&gt;GitHub Actions&lt;/strong&gt; utilizando &lt;strong&gt;Bearer CLI&lt;/strong&gt;, una herramienta avanzada de Análisis Estático de Seguridad de Aplicaciones (SAST) especializada en la detección de fallas OWASP Top 10 y riesgos de privacidad/fuga de datos (PII). Demostramos cómo el pipeline bloquea automáticamente código vulnerable ante una fuga de credenciales en logs (&lt;strong&gt;CWE-134 / Insecure Logging&lt;/strong&gt;), y cómo se aplica la remediación para alcanzar un despliegue seguro.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Arquitectura y Stack Tecnológico
&lt;/h2&gt;

&lt;p&gt;El flujo implementado conecta las herramientas de desarrollo, análisis estático y automatización:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Desarrollador ] 
       │  (git push)
       ▼
[ GitHub Repository ] 
       │  (Trigger Workflow)
       ▼
[ GitHub Actions Runner ]
       │
       ├─► 1. Checkout de Código
       ├─► 2. Escaneo SAST con Bearer CLI
       │      ├── ¿Hay vulnerabilidades HIGH / CRITICAL?
       │      ├── [SÍ] ──► ❌ PIPELINE FALLA (Bloqueo de despliegue)
       │      └── [NO] ──► ✅ PIPELINE EXITOSO
       ▼
[ Despliegue en la Nube (Render / Cloud SaaS) ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Componentes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Node.js &amp;amp; Express (API modular y ligera).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herramienta SAST:&lt;/strong&gt; &lt;a href="https://www.bearer.com/" rel="noopener noreferrer"&gt;Bearer CLI&lt;/a&gt; (Motor de análisis de flujo de datos sensibles y patrones de vulnerabilidad).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orquestador CI/CD:&lt;/strong&gt; GitHub Actions (Automatización de pruebas y compuertas de calidad).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entorno Cloud:&lt;/strong&gt; Render (Plataforma como Servicio - PaaS para despliegue continuo).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2.Configuración del Pipeline de Seguridad (CI)
&lt;/h2&gt;

&lt;p&gt;Para automatizar la verificación de seguridad en cada cambio de código, definimos el flujo en el archivo &lt;code&gt;.github/workflows/bearer-scan.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;yaml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer SAST Scan &amp;amp; Security Pipeline&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;master"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;master"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;security_scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer SAST Security Analysis&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout Repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Bearer CLI Scanner&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bearer/bearer-action@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# Falla el pipeline si encuentra vulnerabilidades de severidad alta o crítica&lt;/span&gt;
          &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high,critical"&lt;/span&gt;
          &lt;span class="c1"&gt;# Escanea todo el repositorio&lt;/span&gt;
          &lt;span class="na"&gt;diff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Por qué Bearer?
&lt;/h3&gt;

&lt;p&gt;A diferencia de los linters tradicionales o analizadores puramente sintácticos, Bearer rastrea el &lt;strong&gt;flujo de datos (dataflow)&lt;/strong&gt; desde las fuentes de entrada (&lt;em&gt;sources&lt;/em&gt;) hasta los puntos de salida (&lt;em&gt;sinks&lt;/em&gt;). Esto le permite identificar con precisión si información personal identificable (PII), secretos o credenciales están siendo expuestos o mal manejados.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Caso Práctico: Introducción Intencional de una Vulnerabilidad
&lt;/h2&gt;

&lt;p&gt;En el endpoint de autenticación (&lt;code&gt;/api/login&lt;/code&gt;), se simuló un error común pero crítico en el desarrollo de software: el registro no sanitizado de credenciales de usuario para fines de depuración (&lt;em&gt;debugging&lt;/em&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Código vulnerable original (&lt;code&gt;server.js&lt;/code&gt;):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email y contraseña requeridos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// ALERTA SAST: Imprimir contraseñas y PII en logs estándar (CWE-134 / CWE-532)&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`[AUTH-LOG] Intento de login para usuario: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; con credencial: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Autenticación exitosa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jwt-simulated-token-bearer-demo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Credenciales inválidas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Detección y Bloqueo en GitHub Actions (Compuerta de Calidad)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8aa6ykifqowv9gogtbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8aa6ykifqowv9gogtbg.png" alt="Detección de vulnerabilidad Bearer SAST" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al realizar el &lt;code&gt;push&lt;/code&gt; hacia el repositorio remoto, el runner de GitHub Actions ejecutó el escaneo de Bearer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resultado del Análisis:
&lt;/h3&gt;

&lt;p&gt;Bearer detectó la vulnerabilidad de severidad &lt;strong&gt;HIGH&lt;/strong&gt; y finalizó el proceso con código de salida &lt;code&gt;1&lt;/code&gt;, deteniendo inmediatamente la integración:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HIGH: Unsanitized user input in format string [CWE-134]
https://docs.bearer.com/reference/rules/javascript_lang_format_string_using_user_input

File: server.js:54
54  console.log(`[AUTH-LOG] Intento de login para usuario: ${email} con credencial: ${password}`);

87 checks, 1 findings
CRITICAL: 0
HIGH: 1 (CWE-134)
Error: Process completed with exit code 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Impacto de Seguridad:&lt;/strong&gt; Registrar credenciales en texto claro (&lt;code&gt;password&lt;/code&gt;) y datos no sanitizados en los flujos de salida del servidor viola normas de cumplimiento como GDPR, HIPAA y PCI-DSS, además de exponer los datos en sistemas centralizados de agregación de logs (CloudWatch, Datadog, ELK).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Fase de Remediación (Fix)
&lt;/h2&gt;

&lt;p&gt;Para resolver el problema sin comprometer la trazabilidad de eventos del sistema, aplicamos el principio de &lt;strong&gt;Mínimo Privilegio en Logs&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eliminar completamente&lt;/strong&gt; el registro de contraseñas u otros datos sensibles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitar concatenaciones de cadenas no sanitizadas&lt;/strong&gt; con datos directos provenientes del cliente.&lt;/li&gt;
&lt;li&gt;Registrar únicamente el evento de autenticación genérico.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Código corregido (&lt;code&gt;server.js&lt;/code&gt;):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email y contraseña requeridos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// PRÁCTICA SEGURA: Registro de eventos sin exponer datos sensibles ni formatos dinámicos&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[AUTH-LOG] Intento de login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Autenticación exitosa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jwt-simulated-token-bearer-demo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Credenciales inválidas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Verificación de Seguridad y Aprobación del Pipeline
&lt;/h2&gt;

&lt;p&gt;El equipo subió la remediación mediante el commit:&lt;br&gt;
&lt;code&gt;fix: remove sensitive login data from logs&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Resultado del nuevo escaneo:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checks ejecutados:&lt;/strong&gt; 87&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hallazgos Críticos:&lt;/strong&gt; 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hallazgos Altos:&lt;/strong&gt; 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estado del Pipeline:&lt;/strong&gt; &lt;strong&gt;SUCCESS (Verde ✅)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxrws3hwcwuvm8r24x6s7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxrws3hwcwuvm8r24x6s7.png" alt="Pipeline exitoso en GitHub Actions" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al no encontrarse infracciones de severidad alta o crítica, el pipeline aprueba los artefactos y autoriza el paso al despliegue continuo en la nube pública.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Lecciones Aprendidas y Buenas Prácticas DevSecOps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;La seguridad como código (Security as Code):&lt;/strong&gt; Definir políticas de escaneo en archivos versionables (&lt;code&gt;.yml&lt;/code&gt;) garantiza consistencia y auditoría en cada contribución.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retroalimentación temprana:&lt;/strong&gt; Detectar vulnerabilidades en el momento del &lt;code&gt;pull request&lt;/code&gt; reduce drásticamente el costo temporal y financiero de mitigar incidentes en producción.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Equilibrio entre seguridad y velocidad:&lt;/strong&gt; Configurar filtros de severidad (&lt;code&gt;high,critical&lt;/code&gt;) previene falsos positivos que puedan frenar innecesariamente el ritmo de entrega del equipo de ingeniería.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protección de PII:&lt;/strong&gt; Las herramientas modernas de SAST deben comprender el contexto de privacidad y no limitarse únicamente a inyecciones SQL o XSS tradicionales.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Recursos y Enlaces
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Código fuente completo:&lt;/strong&gt; &lt;a href="https://github.com/saulalvarado1/Bearer_Articulo" rel="noopener noreferrer"&gt;GitHub - saulalvarado1/Bearer_Articulo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicación en Vivo (Producción):&lt;/strong&gt; &lt;a href="https://bearer-articulo.onrender.com" rel="noopener noreferrer"&gt;https://bearer-articulo.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación oficial de Bearer:&lt;/strong&gt; &lt;a href="https://docs.bearer.com/" rel="noopener noreferrer"&gt;https://docs.bearer.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CWE-134 (Use of Externally-Controlled Format String):&lt;/strong&gt; &lt;a href="https://cwe.mitre.org/data/definitions/134.html" rel="noopener noreferrer"&gt;https://cwe.mitre.org/data/definitions/134.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CWE-532 (Insertion of Sensitive Information into Log File):&lt;/strong&gt; &lt;a href="https://cwe.mitre.org/data/definitions/532.html" rel="noopener noreferrer"&gt;https://cwe.mitre.org/data/definitions/532.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cicd</category>
      <category>devops</category>
      <category>github</category>
      <category>security</category>
    </item>
  </channel>
</rss>
