:bug: eventing: unauthenticated PUT /transcript rewrites what an agent resumes from, and correlation ids are listable
Maintainer thường phản hồi trong vòng 8 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 42/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- python
- Lĩnh vực
- api, authentication, backend, security
Hướng nghiên cứu
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.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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.
- Ngôn ngữ chính
- Python
- Star
- 11
- Fork
- 42
- Merge trung bình
- 4 ngày 4 giờ
- Pull request đã merge (30 ngày)
- 39
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của rossoctl/examples
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 8 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 25/100
rossoctl/examples#986 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 8 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 25/100
rossoctl/examples#985 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 8 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 30/100
rossoctl/examples#984 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 8 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 35/100
rossoctl/examples#983 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 8 ngày
Tất cả issue của rossoctl/examples
Issue tương tự
-
Web transport: small test gapsĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
scikit-learn-contrib/category_encoders#553 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
tests/strategies_test.py:174 goes uncovered on about 1 run in 100, failing the coverage ratchetĐang mởflaky-watch
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
btclib-org/btclib#2839 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
BarrelList constructor drops false-valued iterable contentsCó thể đã có người làm @Gambit-Checkmate đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 19 ngày
-
[Performance]: Redundant object-storage pull when model and tokenizer share the same RunAI URIĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 77/100
vllm-project/vllm#63863 ·
Maintainer thường phản hồi trong vòng 1 ngày