heygrc
Ingenieríathe heygrc team

Los cinco que rompen controles

Los cinco patrones de pull request para los que construimos heygrc para detectar primero. Cada uno parece un cambio razonable, y cada uno elimina un control en el que depende un marco de trabajo.

Cuando tratas el cumplimiento como algo que vive en el código, surge una pregunta: ¿qué cambios realmente rompen un control? No en teoría, sino en el diff. Todavía no tenemos telemetría de producción para responder eso, así que esto no es un gráfico de lo que hemos visto en la práctica. Es la taxonomía que construimos en heygrc para detectar: cinco patrones de pull request que, por construcción, rompen un control de la manera más directa.

Lo que los une es incómodo. Ninguno parece un cambio de cumplimiento. Cada uno es una edición razonable, una limpieza, un desbloqueo, una comodidad, que casualmente elimina el elemento en el que un marco de trabajo dependía. Aquí están.

1. Un secreto en la configuración

La forma más rápida de hacer que una integración funcione es poner la clave donde el código pueda leerla directamente. Funciona al primer intento, pero escribe una credencial en vivo en el repositorio, su historial y en cada clon y caché de CI que alguna vez la extraiga. Un secreto confirmado es un secreto expuesto, y la única respuesta segura es rotarlo.

config/payments.ts+1 -1
- const key = process.env.PAYMENTS_SECRET_KEY+ const key = "<the live key, pasted inline>"const client = new Payments(key)
heygrcISO 27001 A.8.24

La credencial ahora reside en el control de versiones para cualquier persona con acceso al repositorio, ahora o en el futuro. Léela desde un almacén de secretos gestionado y rota la que se confirmó.

2. Autenticación relajada

Una verificación de autorización está bloqueando un cambio, así que se elimina o se amplía a un comodín para desbloquear a un solicitante. La función funciona para todos después de eso, incluyendo a las personas que la verificación existía para excluir.

api/reports.ts+0 -1
export async function getReport(user, id) {-  if (!user.can("reports:read")) return forbidden()  return reports.find(id)}
heygrcSOC 2 CC6.1

Eliminar la verificación permite que cualquier solicitante autenticado lea cualquier informe, no solo aquellos a los que tiene derecho. Restaura la verificación de autorización en lugar de eludirla.

3. Registro desactivado

Una línea de registro es ruidosa, así que se elimina en una limpieza. El sistema sigue funcionando, pero deja de registrar el evento de seguridad que un auditor muestreará más tarde y que necesitarías después de un incidente.

auth/session.ts+0 -1
async function onLogin(userId, ip) {-  await audit.log("auth.login", { userId, ip })  return startSession(userId)}
heygrcISO 27001 A.8.15

El evento de inicio de sesión ya no se registra, por lo que no puede ser monitoreado ni reconstruido más tarde. Mantén el registro; si es demasiado ruidoso, cambia su nivel o destino en lugar de eliminarlo.

4. Reglas de red ampliadas

Un servicio no puede acceder a una base de datos, así que se abre una regla de grupo de seguridad para hacer que la conexión funcione. Funciona, y también cualquier otra conexión ahora dentro del rango, incluyendo las provenientes de internet abierto.

infra/security_groups.tf+1 -1
ingress {  from_port = 5432-  cidr_blocks = ["10.0.0.0/16"]+  cidr_blocks = ["0.0.0.0/0"]}
heygrcNIST 800-53 SC-7

Abrir la regla a 0.0.0.0/0 expone el puerto de la base de datos a todo internet, no solo al servicio que lo necesitaba. Limita la regla a la fuente que requiere acceso.

5. Cifrado eliminado

El cifrado falla en el entorno de staging, así que la solución más rápida es dejar de verificarlo, y el cambio se envía. Los datos que deberían viajar autenticados y cifrados ahora viajan de una manera que pueden ser leídos o manipulados en tránsito.

lib/http.ts+1 -0
const agent = new https.Agent({+  rejectUnauthorized: false,})
heygrcSOC 2 CC6.7

Desactivar la verificación del certificado significa que la conexión ya no está autenticada, por lo que puede ser interceptada por un ataque de hombre en el medio. Mantén la verificación activada y soluciona el certificado de staging en su lugar.

Por qué estos cinco

El patrón en los cinco es el mismo: un cambio que mejora algo, una integración funcional, un solicitante desbloqueado, una salida más limpia, una base de datos accesible, un entorno de staging en verde, pero que silenciosamente elimina una salvaguarda en la que depende un marco de trabajo. El daño al cumplimiento es un efecto secundario de un objetivo razonable, y por eso ni el autor ni una revisión ordinaria lo detectan. Nadie pretendía debilitar un control.

Ese es el caso para revisar el diff frente a los controles, en el momento en que se realiza el cambio. Empezamos con estos cinco porque son los más directos: cada uno se mapea claramente a una cláusula, y cada uno es visible en el propio cambio. Aprenderemos la distribución real una vez que heygrc se ejecute en pull requests reales. Hasta entonces, esto es el mapa, no el territorio, y preferimos decirlo así.

code-reviewcontrolsshift-leftpatterns