:bug: eventing: unauthenticated PUT /transcript rewrites what an agent resumes from, and correlation ids are listable
Los mantenedores suelen responder en 6 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 42/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Activo
- Stack tecnológico
- python
- Área
- api, authentication, backend, security
Línea de trabajo
Start in eventing/handlers.py and trace authentication for the transcript and group routes, then read eventrunner/transcript.py, eventrunner/runner.py, and store.py. Review the related paths in ghauth.py, skills/eventbridge/eventbridge-cli.py, main.py, and kafka_out.py, along with tests/test_ghauth.py; run the relevant tests and verify the exposed transcript, correlation-id, login, and signing behaviors are covered.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
Sign-in guards only the two routes that start work. POST /v0/agents and POST /v0/groups call
auth.resolve; every other route is open. Two consequences are worth separating from the general
"only starting work is authenticated" limit, because together they let an unauthenticated caller
rewrite what an agent resumes from.
Found while documenting the controls for rossoctl/rossoctl#2609. References are to eventing/ at
d9677ddd.
1. PUT /v0/agents/{id}/transcript needs no credential, and feeds claude --resume
The transcript is the session checkpoint EventRunner resumes from. On a cold pod a mode=continue
turn downloads it from EventBridge and passes it to claude --resume
(eventrunner/transcript.py:181-196, eventrunner/runner.py:238,256,301).
PUT is unauthenticated, so anyone who can name a conversation can replace the history the agent
continues with. Request signing does not help: it covers the prompt, not the resume state.
Observed against Handlers with sign-in fully configured (client id and approved list):
PUT without credential -> 200 OK
POST /v0/agents without credential -> 401 Unauthorized
GET without credential -> 200 OK b'{"type":"user","message":{"role":"user","content":"forged history"}}\n'
2. Correlation ids are listable without signing in
GET /v0/groups returns the 100 most recent groups (store.py:273, no query parameter raises it —
handlers.py:206), and GET /v0/groups/{id}/status lists every member's correlation id. Both are
open. So "an attacker would have to guess the id" understates the exposure for any conversation that
belongs to a group.
Confirmed: all_groups() returns 100 when 105 groups exist.
Related
ghauth._post_formraisesHTTPErroron any GitHub 4xx (ghauth.py:57), so the friendly message
at:74-80is unreachable anddevice_flow_disabledsurfaces as a traceback ending in
HTTP Error 400: Bad Request.cmd_logincatches onlyRuntimeError
(skills/eventbridge/eventbridge-cli.py:514-518).tests/test_ghauth.py:265-267patches
_post_form, so the test never sees the status. Reproduced by patchingurlopento raise a 400.- Startup does not check that
EB_SIGNING_KIDis present inEB_VERIFY_KEYSET_PATH
(__main__.py:68checks only that it is set), so EventBridge can start and then flag its own group
events. Combined with the fact that group events are signed only whenEB_SIGNING_KEY_PATHgives a
seed (kafka_out.py:102), a half-configured deployment fails closed on genuine traffic.
Impact
All of the above are documented as limits in rossoctl/rossoctl#2609, so the docs are accurate. The
transcript write is the one I would prioritise: it is an unauthenticated write that changes agent
behaviour, rather than only a read or a notification artefact.
- Lenguaje dominante
- Python
- Estrellas
- 11
- Forks
- 42
- Merge medio
- 4 d 11 h
- PR fusionados (30 d)
- 40
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de rossoctl/examples
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 6 días
-
Dificultad 3/5 1-2 días Aptitud para principiantes 70/100
Los mantenedores suelen responder en 6 días
-
Dificultad 3/5 Medio día Aptitud para principiantes 62/100
Los mantenedores suelen responder en 6 días
-
Dificultad 4/5 3-5 días Aptitud para principiantes 68/100
Los mantenedores suelen responder en 6 días
-
kind/bug
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
Los mantenedores suelen responder en 6 días
Todos los issues de rossoctl/examples
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
cellrishi-code/claude-skills-atlas#165 ·
Los mantenedores suelen responder en 1 día
-
bug confirmed issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
open-webui/open-webui#32635 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Filters: ?field:ne=null matches NULL rows instead of non-NULL onesPosiblemente ocupada @rshdhere la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Netflix/metaflow-service#504 ·
-
needs-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
gke-labs/kube-agents#3394 ·
Los mantenedores suelen responder en 1 día
-
A2A audit timestamps end in +00:00Z (invalid ISO 8601)Posiblemente ocupada @O1sumitkumar la tomó hoy. Abiertobug good first issue help wanted python
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día