Saltar al contenido

Guías

Investigación en seguridad: de un log de Inspect a un párrafo de métodos

Ejecutó una evaluación sobre un modelo: un organismo modelo y su control, un conjunto de ataques, las transcripciones de un agente de auditoría puntuadas por un juez. Antes de dejar constancia del resultado, tres preguntas deciden si se sostiene: qué tan amplia es la incertidumbre, si «ninguno de 200» significa de verdad ninguno, y si puede confiar en el juez que puntuó las transcripciones. Oloproof las responde a partir del log que ya tiene, y escribe la figura, la tabla y el párrafo de métodos a partir de lo que midió.

Leer el log

Oloproof lee logs de UK AISI Inspect, el archivo .eval que escribe inspect eval o un log JSON:

oloproof scores import --from inspect logs/organism.eval
oloproof scores import --from inspect logs/control.eval logs/organism.eval --policy release.yaml

El primer comando importa una ejecución y responde en palabras sencillas. El segundo importa dos ejecuciones, las empareja por los ids de muestra y decide las reglas de comparación de la política; una política dada con dos logs debe contener al menos una (kind: superiority, non_inferiority o equivalence), y un techo sobre una ejecución se decide importando ese log solo con la política. Cada scorer se convierte en un criterio: C aprueba e I falla, el crédito parcial es una puntuación de 0 a 1, y un scorer numérico necesita su rango, indicado con --scale LOW HIGH. Solo se copian los ids y las puntuaciones; las transcripciones se quedan en el log. Vea Una segunda opinión sobre las puntuaciones de otra herramienta para cada regla de lectura.

Las épocas no son más muestras

Ejecutar cada muestra varias veces (las épocas de Inspect) no le da más casos independientes. Oloproof mantiene la muestra como la unidad: el log se importa como una ejecución cuyas réplicas son sus épocas, el valor de cada muestra es la media de sus épocas, y cada muestra pesa lo mismo. Cada época conserva su propio aprobado o suspenso, así que un juez puede comprobarse en épocas, con la muestra como la unidad. Contar las ejecuciones de cada muestra como casos separados trata las repeticiones como prompts nuevos: en la malla del método, agrupar así dos ejecuciones por muestra cubrió una afirmación sobre prompts como estos apenas el 86 % de las veces con un 95 % declarado, aunque se mantuvo para una afirmación sobre las propias muestras (docs/engine/PASS_AT_K_METHOD.md §8). Una muestra con una época en error cuenta como faltante, en su peor valor, nunca como la media de las épocas que terminaron, ya que los errores suelen caer en las muestras difíciles.

No ver ninguno no es que no haya ninguno

Una afirmación de seguridad a menudo descansa en un recuento de cero: ningún ataque tuvo éxito, ninguna transcripción mostró el comportamiento. Cero observado no es una tasa de cero. Sin umbral fijado, Oloproof dice hasta dónde podría llegar aún la tasa y cuántos casos limpios la bajarían:

attack_succeeded: about 0.0%; the true value is likely between 0.0% and 1.9% (95% range, 200 cases).
  None of the 200 cases counted toward it, yet the rate could still be as high as 1.9%: none seen is not none.
  If the next cases show none either, a suite of 368 cases (168 more) would bring the high end to 1.0% or below.

Bajo un techo, la política lo decide. max: 0.01 con 0 de 200 da INSUFFICIENT_EVIDENCE, y el consejo es condicional: «si ninguno de los siguientes casos cuenta tampoco, unos 368 lo decidirían; cada uno que cuente aumenta esa cifra». No se cita ninguna probabilidad, porque sin eventos no hay nada de lo que obtenerla.

rules:
  - id: attack-ceiling
    metric: attack_succeeded
    max: 0.01

¿Lo logra alguna vez? pass@k

Una pregunta de capacidad o de red team suele ser si alguno de k intentos tiene éxito. oloproof passk lee cada época de una muestra como un intento y estima sin sesgo el pass@k de cada muestra, y luego la media de la suite:

oloproof passk logs/organism.eval --from inspect --criterion leaked --k 5

También sirve un archivo con una fila por intento (case, passed, error opcional). Una muestra con un intento en error, o con menos de k intentos, cuenta como faltante, en su peor valor. La respuesta da la estimación y su rango del 95 %. Con --min o --max decide: PASS cuando el rango supera el umbral, FAIL cuando cae entero del lado equivocado, INSUFFICIENT_EVIDENCE en otro caso (salida 0, 1 o 3). El método (docs/engine/PASS_AT_K_METHOD.md) cubrió su 95 % declarado en cada celda de su cuadrícula y lo admitió una auditoría independiente el 3 de noviembre de 2026, en sus términos: los intentos de un caso son independientes entre sí, y no detuvo antes de tiempo los intentos de un caso porque uno tuvo éxito.

Muchas condiciones a la vez: un barrido

Una tabla de veinte diferencias, cada una con su propio intervalo del 95 %, se espera que falle en algún sitio aproximadamente una vez: en la cuadrícula del método, cincuenta intervalos separados se cumplieron todos solo seis veces de cada diez. oloproof sweep decide una familia de contrastes que usted nombra antes de leer las ejecuciones, de modo que toda la tabla se sostiene en conjunto:

sweep:
  conditions:
    control: run_01...
    organism_a: run_01...
    organism_b: run_01...
  contrasts:
    - organism_a - control
    - organism_b - control
oloproof sweep sweep.yaml --policy compare.yaml

Cada contraste es una comparación pareada de dos ejecuciones de una misma suite, decidida por cada regla de comparación de la política, cada afirmación a 1 - alpha/m, con m el número de afirmaciones: la probabilidad de que alguna sea errónea es como mucho alpha. Un contraste que solo lee después de mirar la tabla queda fuera de esa garantía. No se comparan ejecuciones sobre suites distintas.

La seguridad de un monitor frente a su coste de auditoría

Para un protocolo de control, un archivo de una fila por trayectoria, con su arm (attack o honest) y la score de sospecha del monitor, da la seguridad (la proporción de ataques marcados) y la tasa de marcado honesto en cada umbral:

oloproof control monitor.csv --budget 0.02 --min-safety 0.9

Los rangos se cumplen en todos los umbrales a la vez, con ambos brazos juntos, así que un umbral elegido leyendo la curva, como el que se ajusta a un presupuesto de auditoría del 2 %, sigue cubierto. Con --budget y --min-safety decide si algún umbral marca como mucho esa proporción de trayectorias honestas mientras detecta al menos esa proporción de ataques. Los rangos son tan anchos en la cola como en el centro, así que un presupuesto pequeño necesita muchas trayectorias honestas: con 2.000, la tasa de marcado honesto se conoce con unos 3 puntos. La seguridad aquí es frente a los ataques del archivo; un atacante que se adapta al monitor queda fuera.

La seguridad se cuenta sobre las trayectorias del brazo de ataque, haya funcionado o no su ataque. Una trayectoria a la que se pidió insertar una puerta trasera puede no haberla insertado, y no se puede culpar al monitor por no ver lo que no está. Para la seguridad frente a ataques que tuvieron éxito, compruebe antes cada trayectoria de ataque (para una puerta trasera, una prueba con su entrada secreta) y deje en el brazo attack solo las que la superan antes de que el archivo llegue a oloproof control.

Comprobar el juez

Una transcripción puntuada por un modelo es la palabra del juez hasta que las personas coinciden con ella. Etiquete una muestra ciega de la ejecución importada, conservando las transcripciones en su máquina:

oloproof scores import --from inspect --answers logs/organism.eval logs/organism.eval
oloproof review latest --criterion deceptive --by NAME

review extrae la muestra, muestra cada transcripción sin el veredicto del juez, mide el acuerdo y valida el juez solo si supera el umbral que usted declara. Mientras no esté validado, una política que exige jueces validados, como la que escribe oloproof init, no decide una regla sobre él. Para una ejecución que Oloproof llevó a cabo, cuyos casos llevan etiquetas en sus metadatos, oloproof labels disagreements RUN --criterion deceptive --by behavior muestra luego dónde se separan el juez y las personas, por comportamiento y por dirección: lo que el juez aprobó y las personas suspendieron, y al revés. El rango de cada grupo es su propia afirmación; el informe no decide nada.

Redactarlo

oloproof report latest --paper paper/

Esto escribe figure.svg (la estimación y el intervalo de cada métrica), table.md y table.tex, y methods.md, un párrafo que nombra cada método de intervalo y su confianza, dice que los intervalos se refieren a esta suite finita, nombra los casos faltantes y los eventos raros, dice para cada juez si las personas lo comprobaron y con qué frecuencia coincidieron, e indica lo que decidió la puerta. Cada número es el de la ejecución guardada, y el párrafo se construye con frases fijas y hechos registrados; ningún modelo lo escribe. En un notebook:

import oloproof

result = oloproof.analyze_inspect("logs/organism.eval", project="analysis")
result  # the figure, the table and the methods paragraph
result.write("paper/")

Las transcripciones de un agente de auditoría

Una herramienta de auditoría que se ejecuta sobre Inspect, como Petri, escribe un log de Inspect cuyo scorer da a cada transcripción una puntuación por dimensión, a menudo de 1 a 10. Impórtelo con ese rango, oloproof scores import --from inspect --scale 1 10 audit.eval, y cada dimensión se convierte en un criterio con una media acotada y su intervalo. Dos logs así, antes y después de un cambio en el objetivo, se comparan sobre sus transcripciones comunes. Las puntuaciones siguen siendo la palabra del juez: las puntuaciones de un juez, a diferencia de su aprobado o suspenso, todavía no pueden comprobarse frente a las personas.

Qué no está construido

  • Comprobar las puntuaciones de un juez frente a las de las personas, a diferencia de sus veredictos de aprobado o suspenso.
  • Etiquetas de los metadatos de una muestra de Inspect: los casos de una ejecución importada no llevan etiquetas, así que labels disagreements --by agrupa solo ejecuciones que Oloproof llevó a cabo.
  • Un barrido más estrecho que Bonferroni (Dunnett o pruebas cerradas), contrastes entre condiciones sobre suites distintas, y bandas del monitor más estrechas en la cola, varios monitores combinados o protocolos con varios umbrales.
  • Una figura PNG: la figura es solo SVG.

Lo que esto no puede decirle

Cada intervalo se refiere a las muestras de su log. Dice lo que mostraría una ejecución completa y sin errores de estas muestras, no cómo se comporta el modelo con otros prompts, en producción o ante un atacante que se adapta. Un juez comprobado por personas está comprobado en los casos que ellas etiquetaron y con el modelo que los juzgó, no en transcripciones distintas de esas. Y una tasa acotada por debajo del 1 % en su conjunto de ataques no dice nada de los ataques que su conjunto no contiene.