Dejamos que un agente de IA ejecutara Bash y vivimos para contar la historia — Sarah Sanders, PostHog
AAI Engineer
Computing/SoftwareSmall Business/StartupsInternet Technology
Transcript
00:00:00Hola a todos, ¿cómo se sienten? Ya estamos en la recta final. Mi nombre es Sarah y soy ingeniera
00:00:23de contexto en PostHog, y tengo el placer de trabajar en nuestro querido asistente todos los días.
00:00:30Entonces, ¿qué es el asistente? El asistente configura PostHog por ustedes. Es una herramienta CLI agéntica
00:00:39que lee su código base, instala el SDK adecuado para su proyecto, instrumenta
00:00:44sus eventos y configura paneles para ustedes. Toma lo que solía tomar alrededor de una o dos horas
00:00:52de configuración y lo ejecuta en unos cinco o seis minutos, y es inferencia gratuita
00:00:57por nuestra cuenta para que tengan una gran experiencia incorporándose a PostHog. Suena bastante genial. A la gente
00:01:03le encanta. Pero hace unos meses nos atrevimos a soñar: ¿y si esto se convirtiera en la forma recomendada o predeterminada
00:01:10de instalar PostHog en su proyecto? Y las alarmas de seguridad de mi cabeza empezaron a sonar.
00:01:17Empecé a cuestionar qué tan seguro es esto, porque tiene pinta de malware.
00:01:25Y en ese cuestionamiento aprendí mucho. Así que hoy se trata de las lecciones que aprendí,
00:01:31las cosas que no me dejaban dormir por la noche mientras construía esto y lo que terminé creando
00:01:37debido a ello. Así que antes de sumergirme en todo el aburrido tema de seguridad, también conocido como su siesta de las dos de la tarde, quiero mostrarles el asistente funcionando en vivo.
00:01:49Si miran arriba en la pantalla, se está ejecutando en un bucle. Esta es exactamente la misma experiencia que cualquiera que ejecute
00:01:56NPX en PostHog Wizard obtiene en su terminal. Como dije, es un agente. Averigua qué SDK es el adecuado para tu proyecto. Lo instala por ti, instrumenta tus eventos, construye paneles.
00:02:10Me gusta llamarlo un pequeño miniingeniero de implementación en tu terminal. Y a veces le muestro esto a la gente y me preguntan ¿por qué un agente? ¿Por qué no le dan a los usuarios un buen prompt? ¿Por qué no les dan una habilidad que puedan invocar en su propia herramienta?
00:02:23Y aunque ofrecemos esas cosas, la respuesta es porque esta experiencia de desarrollo y la capacidad del asistente son el punto central. Es todo el producto.
00:02:34Porque construimos una herramienta CLI que puede participar plenamente en un bucle de agentes y experimentar eso por primera vez es realmente poderoso.
00:02:43Pero no puedes lanzar algo como el asistente sin lanzar las cosas que hacen que el asistente sea un poco sospechoso.
00:02:50Así que vamos a desglosarlo. Miremos la anatomía del asistente porque por lo general los modelos de amenazas surgen directamente de la anatomía del agente.
00:03:01Entonces, el asistente tiene una forma similar a lo que estoy segura de que muchos de ustedes están construyendo si están creando agentes.
00:03:07Tiene modelos que hemos elegido para tareas específicas. Tiene prompts que lo guían y tiene un conjunto de herramientas que le hemos entregado para hacer el trabajo.
00:03:17Pero también tiene algunas piezas que son muy específicas para nosotros. Tiene un motor de contexto completamente construido internamente por mi equipo.
00:03:25Es lo que le permite al agente hacer un gran trabajo y darnos resultados similares en cada ejecución.
00:03:30Me gusta llamarlo el cerebro del asistente. A veces lo llamamos Markdown disfrazado.
00:03:35Pero es nuestro motor de contexto interno. También hay una interfaz de usuario de terminal que construimos nosotros mismos usando Ink.
00:03:43Y ahora hay un escáner de seguridad llamado warlock (hechicero), que es lo que construí cuando comencé a curiosear y a descubrir los horrores de lanzar un agente a producción.
00:03:55Así que si tomas la anatomía de cualquier agente que pueda ejecutar comandos, es básicamente lo que me gusta llamar el kit de inicio de malware.
00:04:03Porque es casi exactamente lo que le entregarías a una pieza de malware si te sintieras generoso o caótico malvado.
00:04:11Por suerte, este es el peor escenario o material de pesadilla y no es una confesión para mí, es una advertencia para todos ustedes.
00:04:19Porque si quieren lanzar un agente con manos, un agente que pueda ejecutar comandos, deben asegurarse de no construir esto.
00:04:28Así que la versión cero del asistente nació porque Josh Snyder, si lo conocen en nuestro equipo de crecimiento, estaba viendo a Cursor alucinar configuraciones de PostHog de la peor manera posible.
00:04:41Y pensó: ¿y si construyéramos un agente que pudiera hacer un mejor trabajo?
00:04:46Así que mi equipo comenzó a construir sobre eso al validar que hacía un trabajo mucho mejor que las alucinaciones de Cursor.
00:04:52Y pensamos: ¿y si pudiera integrar a cualquiera en PostHog?
00:04:58No importa cuál sea su framework, cuál sea su stack, instrumentar todos sus eventos sin que tengan que tocar nada.
00:05:04Y luego nos atrevimos a soñar: ¿y si fuera la forma predeterminada de instalar PostHog?
00:05:09Soñábamos con miles de desarrolladores ejecutando esto por semana y ayer acabamos de llegar a 8,000 personas ejecutándolo por semana.
00:05:16Así que nuestro sueño se hizo realidad.
00:05:18Pero nosotros, en aquellos días en los que soñábamos, tuvimos que poner nuestra postura de seguridad bajo el microscopio y mirar qué estaba pasando.
00:05:26Así que asumí la responsabilidad de eso, me senté y evalué dónde estábamos parados.
00:05:31Y al principio, hablo de hace como un año o nueve meses, teníamos lo que llamo la capa cero porque literalmente no es seguridad.
00:05:41Son solo prompts que sugieren lo que el agente debe hacer y lo guían, y los prompts no son seguridad.
00:05:48Así que estaba preocupada por eso.
00:05:51La capa uno era una lista blanca.
00:05:53Y cuando comencé a investigar esta lista blanca, empecé a sentirme un poco mejor porque estaba bastante acotada.
00:05:59Pero aún tenía muchas preocupaciones.
00:06:01Y comencé a entrar en pánico debido a ese motor de contexto del que les hablé.
00:06:05Estamos alimentando un montón de contexto al agente en tiempo de ejecución.
00:06:09Así que construí este escáner de expresiones regulares muy rudimentario para buscar cosas con forma de amenaza que entraran al asistente y cosas con forma de amenaza que salieran de él.
00:06:20Y admito que era extremadamente chapucero.
00:06:23Pero les digo todo esto con mucha franqueza porque todos estamos construyendo cosas que se sienten extremadamente experimentales y las construimos súper rápido.
00:06:33Y sé que no todos tenemos la seguridad entre nuestras especialidades.
00:06:38Y algunos simplemente la estamos aprendiendo sobre la marcha, como me pasó a mí.
00:06:43Pero es algo en lo que debemos pensar cuando construimos cosas que tienen esta forma.
00:06:50Esa era nuestra postura de seguridad.
00:06:53Pero hice la pregunta: ¿estamos fritos?
00:06:56Buenas noticias, estábamos menos fritos de lo que pensaba.
00:06:59Porque cuando mencioné antes esa lista blanca, estaba bastante limitada.
00:07:03Tenía a bash como denegado por defecto.
00:07:06Solo podía instalar paquetes confiables que hubieran sido examinados por nosotros.
00:07:09Podía compilar.
00:07:10Podía verificar tipos.
00:07:11Podía analizar código (linting).
00:07:12Y prácticamente nada más.
00:07:13No podía ejecutar comandos de shell aleatorios.
00:07:16Y no tenía acceso a variables de entorno.
00:07:20El agente no podía leer tu archivo .env porque lo bloqueamos por completo y redirigíamos los secretos a través de una bóveda.
00:07:28Así que respiré aliviada y me di cuenta de que estábamos en un lugar mejor de lo que pensaba.
00:07:34Pero quería saber dónde estaban las grietas, porque en seguridad siempre hay grietas.
00:07:39Así que hice lo que todos deberíamos estar haciendo.
00:07:41Fui con nuestro equipo de seguridad y les dije: oigan, ¿pueden auditar esto por mí y encontrar esas grietas?
00:07:48Y encontraron algunas cosas.
00:07:51Encontraron algunas brechas.
00:07:52Y lo interesante no fueron las brechas o errores específicos que encontraron, sino la forma que tenían.
00:07:58Porque casi ninguna era obviamente malvada.
00:08:01Eran dos cosas muy inocentes y bienintencionadas que se daban la mano y abrían un agujero.
00:08:07Así que la lección que aprendí fue que los ataques se componen, la revisión de código no, porque los desarrolladores miramos los cambios de código (diffs) uno a la vez.
00:08:20Pero los atacantes miran todo el sistema y buscan esas dos cosas que se dan la mano y abren una puerta.
00:08:25Pero había una cosa más que no me dejaba dormir por la noche.
00:08:29Y volviendo a ese motor de contexto, me di cuenta de que la parte más aterradora del agente que habíamos construido no era realmente un comando en nuestro caso.
00:08:37Eran las cosas de apariencia útil con las que estábamos alimentando su cerebro.
00:08:43Oh, creo que fui por el camino equivocado.
00:08:46Sí.
00:08:47La fábrica de contexto.
00:08:48Así que este es nuestro motor de contexto, también conocido como el cerebro del asistente.
00:08:51Y es cómo el asistente sabe algo en absoluto y por qué el asistente realmente hace un buen trabajo.
00:08:56Extrae información de nuestra documentación.
00:08:58Tiene prompts escritos a mano que son trampas y lecciones que aprendimos en el camino.
00:09:02Y aplicaciones de ejemplo de extremo a extremo reales que ayudan al agente a encontrar patrones para que pueda instalar PostHog de una manera genial para ti.
00:09:11Empaqueta todo eso en paquetes de habilidades que se envían al asistente a través de nuestro servidor MCP y se cargan directamente en el contexto del agente en tiempo de ejecución.
00:09:22Así que piensen en eso por un segundo.
00:09:24Es una máquina cuyo único trabajo es tomar contenido e inyectarlo en un agente que puede ejecutar comandos.
00:09:31Ahora, si fueras un atacante, podrías decir: “Bueno, ¿y si simplemente enveneno el contenido?”
00:09:36No el código base del usuario, ni el agente en sí, sino el contenido real.
00:09:41Digamos que alguien abre una solicitud de extracción (pull request) en uno de nuestros repositorios de código abierto, porque en PostHog construimos todo de forma abierta,
00:09:48e inyectan algo en un archivo markdown o en un comentario de código aparentemente inofensivo,
00:09:55y tenemos algún tipo de revisión de código impulsada por LLM que lo revisa y dice: “Se ve bien” y lo ignora.
00:10:04Es posible que hayamos lanzado una carga útil de inyección de prompt firmada por nosotros en un agente que se está ejecutando en las máquinas de miles de desarrolladores en un entorno aislado, pero aun así.
00:10:14Esa fue la amenaza que reformó mi forma de pensar sobre la seguridad y el asistente, porque la entrada peligrosa para nosotros realmente podía provenir de nuestra propia cadena de suministro.
00:10:25Así que lo que terminé haciendo es comenzar a escanear contenido en ambos extremos de este flujo.
00:10:30Uno, cuando se construye y lanza una habilidad, y otra vez cuando el asistente realmente la usa.
00:10:36Mi metodología es: atrápalo en la fuente, asume que la fuente falló y atrápalo de nuevo en el punto de uso.
00:10:43Así que ahora puedo presentarles a Warlock (el hechicero).
00:10:48Construir a Warlock no fue necesariamente control de daños.
00:10:52Como dije, teníamos defensa de otras maneras.
00:10:55Pero construí a Warlock porque no me gustaba decirle a la gente: “Bueno, esta cosa está, digamos, bastante blindada.
00:11:01Eso no escala.
00:11:02Eso no es algo que quieras enviar a producción.
00:11:04Eso no es algo que quieras que miles de desarrolladores ejecuten todos los días”.
00:11:08Porque cuando envías algo a esa escala, tienes mucha más superficie, muchos más usuarios, mucho más contenido fluyendo a medida que expandes la capacidad del asistente.
00:11:19Y probablemente estemos bien.
00:11:21Simplemente deja de ser suficiente.
00:11:23Así que saqué ese pequeño y rudimentario escáner de expresiones regulares que había metido ahí, lo saqué del asistente e hice algo independiente.
00:11:30Lo llamé Warlock porque todo lo que tiene forma de mago necesita un guardaespaldas.
00:11:35Y hace exactamente una sola cosa.
00:11:38Le entregas una cadena de texto.
00:11:40Te devuelve una lista de hallazgos.
00:11:42Cada uno de esos hallazgos tiene una categoría, una gravedad y una acción recomendada, y luego se detiene.
00:11:48Quiero que se centren en lo de recomendado aquí.
00:11:51Porque Warlock detecta, pero no actúa.
00:11:54Te dirá: “Ey, esto parece una exfiltración.
00:11:57Es crítico.
00:11:58Yo lo bloquearía”.
00:11:59Pero lo que hagas en realidad con ese hallazgo depende completamente de ti.
00:12:04Porque detectar un problema es una tarea, y decidir qué hacer al respecto es otra totalmente distinta.
00:12:10Y lo único que mantiene todo esto comprensible es mantener ambas cosas separadas.
00:12:15Así que bajo el capó de Warlock, en lugar de mis expresiones regulares caseras, las reglas corren sobre Yara, que es el patrón que los investigadores de malware usan desde hace, más o menos, 15 años.
00:12:27Es totalmente determinista.
00:12:28Es la misma entrada, la misma salida, cada vez.
00:12:31Es aburrido a propósito.
00:12:33Y en seguridad, ser aburrido es una ventaja.
00:12:39Entonces, ¿qué detecta Warlock en el mundo real hoy en día?
00:12:42Un montón de cosas diferentes, pero dos de ellas son una auténtica molestia para mi alma.
00:12:48Lo primero no es en realidad algo en forma de regla.
00:12:52Fue algo que Warlock marcó y que en realidad era un comportamiento de un subagente que nos expuso una vulnerabilidad según lo que estaban haciendo.
00:13:03Básicamente, estábamos lanzando agentes para hacer tareas grandes.
00:13:07Estaban generando subagentes.
00:13:08Y esos subagentes intentaban sortear las barreras de protección que habíamos implementado en el wizard, e intentaban inventar secretos.
00:13:16Intentaban extraer secretos de literalmente cualquier parte de la base de código.
00:13:20Y lo detuvimos.
00:13:21Dijimos: “No más subagentes”.
00:13:23Y gracias a Warlock, atrapamos eso.
00:13:26Y empatizo con el robot.
00:13:28El robot tenía una tarea que hacer, e intentaba optimizar y complacernos.
00:13:32Pero no podemos permitir eso.
00:13:35Y algo más en PostHog que nos importa mucho es la PII.
00:13:39A los agentes realmente no les importa exponer datos a menos que establezcas reglas explícitas.
00:13:46Si los dejas solos, vimos cómo volcaban correos y números de teléfono directamente en eventos, y para un agente eso parece algo totalmente normal de capturar.
00:13:57Y por suerte, en cuanto a la inyección de prompts específicamente, toco madera aquí, prácticamente nunca hemos atrapado una inyección de prompts maliciosa real en el entorno.
00:14:08Pero sí atrapamos un montón de falsos positivos, cosas como nuestras pantallas de inicio de sesión de demostración, textos en nuestras apps de ejemplo, cosas en nuestra documentación.
00:14:17Y de hecho me ha hecho replantearme cómo construyo aplicaciones y cómo escribo documentación, porque no quiero enviar nada que parezca una amenaza.
00:14:27Pero los falsos positivos son, sinceramente, la preparación perfecta para la parte más desordenada e interesante de todo esto.
00:14:36Así que esta es la parte con la que lidié.
00:14:39Pasé toda esta charla predicando lo determinista a todos ustedes, y luego fui y añadí una capa de LLM para ayudar a ordenar mis falsos positivos y silenciar parte del ruido.
00:14:50Y lo llamo triaje.
00:14:51Cuando estaba construyendo esta capa de triaje, tuve que tomar una decisión.
00:14:56¿Debería la capa ser un portero de discoteca o debería ser un asesor?
00:15:01Y la opción más fácil probablemente habría sido hacer que el LLM fuera el portero.
00:15:06Mostrarle el comando, preguntarle si es un ataque, bloquear, permitir y simplemente hacer lo que diga.
00:15:13Y aunque eso tienta porque parece más fácil, no puedo apostar mi modelo de seguridad al lanzamiento de una moneda porque mi modelo tenga un mal día o haya pasado algo y actúe diferente hoy a como lo hizo ayer.
00:15:26Así que, en lugar del portero, diseñé el modelo para que fuera el asesor.
00:15:32Y esta fue la línea clara que encontré y que sigo explorando, pero que quiero dejarles a todos ustedes.
00:15:38Primero, para nosotros, la detección y la aplicación se mantienen deterministas y mecánicas.
00:15:43Si una regla coincide, la puerta se cierra, la sesión termina y no hay ningún modelo en ninguna parte de ese camino.
00:15:49El bloqueo ocurre incluso antes de pedir la opinión del LLM.
00:15:54El LLM solo puede opinar después si no hemos bloqueado algo.
00:15:58Está diseñado para eliminar ruido.
00:16:00No está diseñado para dejar pasar las cosas.
00:16:03Y si falla cerrando, es decir, si el modelo tiene un mal día, todas las ejecuciones del wizard se cancelan; lo siento, pero solo estamos protegiéndote.
00:16:14La aplicación es la parte por la que apuestas todo, así que tiene que ser determinista.
00:16:20Pero el juicio es la parte que añade matices, así que ese es realmente el único lugar donde puedes poner algo probabilístico.
00:16:27¿Cómo implementamos reglas reales para los agentes?
00:16:34Esta es la anatomía de una de nuestras reglas de warlock, y cada regla de warlock tiene cuatro partes.
00:16:41La primera parte son los metadatos.
00:16:43Es una descripción en inglés sencillo, severidad, categoría, acción, dirección.
00:16:50Primera parte, ¿esto fluye hacia el agente?
00:16:52¿Es esto algo que el agente está escribiendo?
00:16:57Luego tenemos las cadenas, que son los patrones reales que estás buscando.
00:17:03Y la tercera parte es la condición.
00:17:05Aquí es donde realmente se permite que la regla se active.
00:17:10Repasaré este ejemplo para ustedes, y podemos fingir que lo estamos escribiendo en nuestra cabeza.
00:17:15La inyección de prompts siendo algo así como el clásico ignora todas las instrucciones anteriores.
00:17:20Su primer instinto aquí probablemente sea bloquear la palabra ignorar, pero los agentes leen código todo el día,
00:17:27y la palabra ignorar puede aparecer en comentarios de código o ejemplos todo el tiempo.
00:17:31Así que no quieres hacer coincidir el verbo por sí solo.
00:17:33Haces coincidir el verbo más un sustantivo con matiz de instrucción.
00:17:38En la condición, dices que se active si cualquiera de esos patrones coincide.
00:17:42Y en los metadatos, determinas si es crítico, cuál es la categoría, cuál es la acción,
00:17:50en este caso bloquear, y la dirección, que en este caso es la entrada que fluye hacia el agente.
00:17:56Pero para escribir buenas reglas que reduzcan el ruido, tienes que incluir pruebas con ellas.
00:18:02Así que tienes que escribir pruebas que digan estos son patrones que coinciden.
00:18:06Estos son los que no deberían.
00:18:08Y esa prueba negativa es la primera línea de defensa contra los falsos positivos.
00:18:13Pero también quieres asegurarte, al decidir la severidad de esa regla,
00:18:19de rastrear el impacto en el mundo real, no lo aterrador que parezca.
00:18:24RM-RF da miedo, pero también es como todos borramos los node modules unas 40 veces al día.
00:18:31Tú decides el impacto en el mundo real para el agente que estás construyendo,
00:18:37porque una herramienta de seguridad que falla cada vez que intenta limpiar una carpeta de compilación
00:18:42es una herramienta que termina apagada y que no atrapa absolutamente nada.
00:18:47Así que estoy orgulloso de decir que esta es nuestra postura de seguridad ahora.
00:18:51Por fin puedo subir aquí y decir que tenemos una verdadera defensa en profundidad.
00:18:56Todos mis aprendizajes se han reunido en esto.
00:19:00Todavía está en capas, pero cada capa está haciendo un trabajo en el que ahora es buena.
00:19:04Todavía tenemos prompts, pero solo los usamos para orientar.
00:19:07Todo se ejecuta en un sandbox.
00:19:09Negamos por defecto.
00:19:11Tenemos una bóveda para que los secretos nunca lleguen al modelo.
00:19:14Tenemos a warlock para escanear el contenido que entra
00:19:17y para escanear la salida escrita por el agente.
00:19:20También tenemos triaje para reducir el ruido,
00:19:23y tenemos telemetría integrada en todo el proceso
00:19:26para que podamos ver todo.
00:19:28Ninguna de estas capas se sostiene por sí sola.
00:19:31Ni una sola cosa aquí te va a salvar,
00:19:33sino que son solo capas aburridas y honestas,
00:19:36cada una haciendo un trabajo en el que es buena.
00:19:40Así que si estás construyendo un agente con manos,
00:19:45esta es toda la charla en tres líneas.
00:19:47Uno, si no se aplica de forma determinista,
00:19:50no se aplica.
00:19:52Los prompts no son reglas de seguridad.
00:19:54No actúes como si lo fueran.
00:19:57Dos, la entrada peligrosa no es solo lo que tu usuario escribe.
00:20:02No son solo los comandos que le permites ejecutar.
00:20:04Es todo lo que fluye hacia el modelo,
00:20:06incluido el contenido que tú mismo escribes.
00:20:09Así que escanea tu propia cadena de suministro en la fuente
00:20:12y cuando el agente la invoque.
00:20:15Tres, los ataques se componen, la revisión de código no.
00:20:18La mayoría de nuestras brechas durante nuestra auditoría fueron dos cosas inocentes,
00:20:22estrechar la mano y abrir una puerta.
00:20:25El wizard, el warlock y el contexto son de código abierto,
00:20:29así que vengan a buscarme abajo.
00:20:32Estoy en el pabellón de exposiciones en nuestro stand
00:20:34y les mostraré el lugar, les mostraré lo que construimos,
00:20:37y quiero escuchar cómo están asegurando ustedes sus agentes.
00:20:41Gracias.
00:20:59Gracias.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video