Anthropic ha lanzado el complemento Claude Security para Claude Code en versión beta. El complemento ejecuta un análisis de vulnerabilidades de múltiples agentes de un repositorio desde una sesión existente de Claude Code y luego convierte los hallazgos que seleccione en archivos de parche que puede revisar y aplicar usted mismo. Anthropic enfatizó la versatilidad de la herramienta tras el anuncio, destacando su capacidad para ejecutar un escaneo completo de todo el código base o inspeccionar los cambios desde la terminal justo antes de una confirmación.
Que complemento agrega
El complemento agrega un único comando, /claude-security, que abre un menú de tres trabajos, según la documentación oficial:
Escanear la base de código: todo el repositorio o un subconjunto del mismo. Escanear cambios: la diferencia de una rama, la diferencia de una solicitud de extracción o una confirmación única. Sugerir parches: convertir los hallazgos de un informe en archivos .patch.
La instalación son dos comandos del mercado oficial de Anthropic:
Si no se encuentra el mercado, ejecute /plugin Marketplace add anthropics/claude-plugins-official primero. La fuente del complemento es pública en el repositorio oficial de claude-plugins, actualmente en la versión 0.10.0.
Cómo está estructurado el proceso de escaneo
El escaneo se implementa como un flujo de trabajo dinámico: un script de orquestación de JavaScript que los fanáticos elaboran entre subagentes. El guión declara seis fases:
Inventario: dividir el repositorio en componentes. Cada directorio de nivel superior debe escanearse o omitirse explícitamente con un motivo. Modelo de amenazas: un modelador por componente, que produce puntos de entrada, sumideros, límites de confianza y archivos que un investigador debe leer en su totalidad. Investigación: un investigador por componente × celda de categoría. Barrido: rellenar huecos sobre lo que la matriz no cubrió. Panel: verificación adversarial de tres lentes, un votante por lente. Adversario: solo esfuerzo máximo: volver a seleccionar las fortalezas marginales, luego formar un equipo rojo con cada superviviente.
La investigación se realiza en cuatro categorías fijas: inyección y entrada, autenticación y acceso, memoria e inseguridad y criptografía y secretos. La lente de memoria e inseguridad se elimina para los componentes escritos completamente en lenguajes seguros para la memoria, por lo que un componente puro de Python o TypeScript obtiene tres lentes en lugar de cuatro.
La escala operativa de una carrera está dictada por cuatro niveles de esfuerzo distintos: bajo, medio, alto y máximo. Dependiendo del nivel seleccionado, se aplican umbrales específicos: el número máximo de componentes tiene un límite de 12 para los niveles bajo y medio, y se expande a 24 para los niveles alto y máximo; a las células de la matriz se les asigna 1 investigador, que aumenta a 2 en los niveles alto y máximo; y el número de barridos de relleno de espacios varía de 0 en nivel bajo a 1 en nivel medio y hasta 2 en nivel alto y máximo. Cuando se trata de un alcance limitado o una diferencia pequeña, el proceso se condensa en una configuración de un solo investigador en lugar de implementar toda la matriz. Esto garantiza que la evaluación siga siendo estrictamente proporcional al objetivo, manteniendo al mismo tiempo el mismo estándar de verificación.
El sistema emplea agentes por niveles: el orquestador se ejecuta en Opus, mientras que el cartógrafo del repositorio y el explorador de código de solo lectura se ejecutan en Sonnet. Además, los investigadores y verificadores heredan el modelo de sesión, y los agentes de escaneo están restringidos exclusivamente a herramientas de solo lectura.
Cómo un hallazgo gana su lugar en el informe
Esta es la parte que vale la pena entender de cerca. El hallazgo de un candidato no se incluye en el informe porque lo encontró un investigador. Entra sólo después de sobrevivir a un panel.
Cada candidato pasa por tres verificadores independientes, uno por lente: ALCANCE, IMPACTO y DEFENSAS. Cada uno devuelve un veredicto estructurado de TRUE_POSITIVE o FALSE_POSITIVE con una o dos líneas que nombran el archivo decisivo: línea. El quórum para mantener es 2 de 3. Si regresan menos de tres votantes, no se puede mantener al candidato en absoluto.
El resultado del panel también limita la confianza declarada en el hallazgo. Un panel unánime de 3/3 permite un techo de confianza alto; un quórum de 2/3 lo limita a medio. Un hallazgo no puede pretender tener más confianza que la que obtuvo su verificación.
Lo más importante es que el procesador del informe calcula el recuento en Python, no el modelo que produjo los hallazgos. El estado de verificación del sello de revisión se establece en verificado solo cuando el registro de votación demuestra que el panel realizó todas las conclusiones del informe; de lo contrario, no se verifica con un motivo declarado. Eso hace que la propia explicación del rigor del informe sea algo que usted pueda verificar en lugar de algo en lo que pueda confiar.
[v’ + (i+1) + ‘] ‘ + lk + ” + ld + ‘
‘; var btn = document.createElement(‘botón’); btn.type=”botón”; btn.className=”alternar”; btn.addEventListener(‘hacer clic’, función(){ votos[i] = !votos[i]; pintarVotos(); renderPanel(); }); fila.appendChild(btn); votantesEl.appendChild(fila); }); función paintVotes(){ var btns = votantesEl.querySelectorAll(‘.toggle’); for (var i = 0; i < btns.length; i++){ btns[i].textContent = votos[i] ? 'TRUE_POSITIVE': 'FALSE_POSITIVE'; btns[i].className="alternar " + (votos[i] ? 'tp' : 'fp'); btns[i].setAttribute('aria-label', LENTES[i].k + ': ' + botones[i].textContenido + '. Haga clic para voltear.'); } } función pad(s, n){ s = Cadena(s); mientras (s.length < n) s += '.'; devolver s; } función renderPanel(){ var t = votos.filtro(Booleano).length; var f = 3 - t; var mantenido = t >= 2; var techo = t >= 3 ? ‘ALTO’: ‘MEDIO’; var líneas=””; LENTES.forEach(función(l, i){ líneas += ‘ [v’ + (i+1) + ‘] ‘ + pad(lk + ‘ ‘, 18) + ‘ ‘ + (votos[i] ? ‘VERDADERO_POSITIVO‘ : ‘FALSE_POSITIVO‘) + ‘\n’; }); veredicto var = mantenido? ‘MANTENER escrito en CLAUDE-SECURITY-RESULTS.md como F1′: ‘DESECHAR nunca mostrado; no aparece en el informe en absoluto»; var conf = mantenido? ‘ ‘ + pad(‘techo de confianza ‘, 22) + ‘ ‘ + techo + ‘‘ + (t >= 3 ? ‘ (unánime)‘ : ‘ (quórum, no unánime)‘) + ‘\n’ : ”; panelOut.innerHTML = ‘$ panel –hallazgo F1 –votantes 3 –quórum 2\n\n’ + líneas + ‘\n’ + ‘ ‘ + pad(‘tally ‘, 22) + ‘ ‘ + t + ‘ true / ‘ + f + ‘ false\n’ + ‘ ‘ + pad(‘veredicto ‘, 22) + ‘ ‘ + veredicto + ‘\n’ + conf; cambiar el tamaño(); } pintarVotos(); renderPanel(); /* ———- 3. planificador de esfuerzo ———- */ var tier=”medium”, memsafe = false; var compEl = document.getElementById(‘comp’); var compV = document.getElementById(‘comp-v’); var esfuerzoOut = document.getElementById(‘esfuerzo-fuera’); var memBtn = document.getElementById(‘memsafe’);
[].slice.call(root.querySelectorAll(‘[data-tier]’)).forEach(function(b){ b.addEventListener(‘click’, function(){ nivel = b.getAttribute(‘data-tier’);
[].slice.call(root.querySelectorAll(‘[data-tier]’)).forEach(function(x){ x.setAttribute(‘aria-pressed’, x === b ? ‘true’ : ‘false’); }); renderEffort(); }); }); memBtn.addEventListener(‘click’, function(){ memsafe = !memsafe; memBtn.setAttribute(‘aria-pressed’, memsafe ? ‘true’ : ‘false’); renderEffort(); }); compEl.addEventListener(‘entrada’, función(){ compV.textContent = compEl.value; renderEffort(); }); function renderEffort(){ var big = (nivel === ‘alto’ || nivel === ‘max’); var cap = grande? 24:12; var encontrado = parseInt(compEl.value, 10); var usado = Math.min(encontrado, límite); var gatos = memsafe? 3: 4; var por = grande? 2: 1; var barridos = nivel === ‘bajo’? 0: (grande? 2: 1); var bajo = (nivel === ‘bajo’); var investigadores = usados * gatos * por; var caído = encontrado > límite? ‘\norte límite de inventario: manteniendo ‘ + cap + ‘ de ‘ + encontrado + ‘ componentes; el resto se fusionan o eliminan’ : ”; var researchLine = bajo? ‘ ‘ + pad(‘forma ‘, 24) + ‘ investigador único (sin matriz de componentes)‘ : ‘ ‘ + pad(‘matriz de categorías ‘, 24) + ‘ ‘ + gatos + ‘ categorías × ‘ + por + ‘ investigador’ + (por > 1 ? ‘s’ : ”) + ‘ por celda\n’ + ‘ ‘ + pad(‘investigadores enviados ‘, 24) + ‘ ‘ + investigadores + ‘‘; esfuerzoOut.innerHTML = ‘$ /base de código de escaneo de seguridad claude –effort ‘ + nivel + ‘\n\n’ + ‘ ‘ + pad(‘límite de componente ‘, 24) + ‘ ‘ + límite + ‘ (12 en bajo/medio, 24 en alto/máximo)\n’ + ‘ ‘ + pad(‘componentes escaneados ‘, 24) + ‘ ‘ + usado + ‘ de ‘ + encontrado + eliminado + ‘\n’ + researchLine + ‘\n’ + ‘ ‘ + pad(‘barridos de relleno de espacios ‘, 24) + ‘ ‘ + barridos + ‘\n’ + ‘ ‘ + pad(‘verificación ‘, 24) + ‘ Panel de 3 votantes por candidato superviviente\n’ + ‘ ‘ + pad(‘pase adversario ‘, 24) + ‘ ‘ + (nivel === ‘max’ ? ‘en (repanel de fortalezas marginales, supervivientes del equipo rojo)‘ : ‘apagado: solo esfuerzo máximo‘) + ‘\n\n’ + ‘ Cada nivel supera la misma barra de verificación. Un análisis exhaustivo cubre\n’ + ‘ más terreno; no reduce el estándar que debe cumplir un hallazgo.‘; cambiar el tamaño(); } renderEffort(); /* ———- 4. árbol de informes ———- */ document.getElementById(‘report-out’).innerHTML = ‘$ ls -R CLAUDE-SEGURIDAD-20260722-1412/\n\n’ + ‘ CLAUDE-SEGURIDAD-RESULTADOS.md el informe legible\n’ + ‘ CLAUDE-SECURITY-RESULTS.jsonl un objeto JSON por hallazgo\n’ + ‘ CLAUDE-SEGURIDAD-REVISIÓN-a1b2c3d4e5f6.json\n’ + ‘ el compromiso, el esfuerzo, la severidad cuenta,\n’ + ‘ y cuán minuciosamente se verificó\n’ + ‘ parches/\n’ + ‘ parche F1 F1.md un parche + nota por hallazgo\n’ + ‘ .gitignore entonces un git add perdido no puede confirmarlo\n\n’ + ‘ El nombre del archivo de revisión lleva -dirty cuando los cambios no confirmados eran\n’ + ‘ parte del árbol escaneado, por lo que un informe siempre está vinculado al código que\n’ + ‘ describe.‘; /* ———- cambio de tamaño automático para iframe de WordPress ———- */ function resize(){ try { var h = root.offsetHeight + 40; if (window.parent && window.parent !== ventana) { window.parent.postMessage({ mtpEmbedHeight: h, id: ‘mtp-cs-term’ }, ‘*’); } } catch (e) {} } window.addEventListener(‘cargar’, cambiar tamaño); window.addEventListener(‘cambiar tamaño’, cambiar tamaño); setTimeout(cambiar tamaño, 120); setTimeout(cambiar tamaño, 600); })();