PraisonAI DiscordApproval은 관련 없는 채널 메시지를 위험한 도구 승인으로 받아들입니다.
praisonai.bots.DiscordApproval은 보류 중인 위험한 도구 호출을 승인합니다.
텍스트가 다음과 같이 구성된 Discord 채널에서 나중에 봇이 아닌 메시지를 봅니다.
'예'와 같이 승인으로 분류됩니다.
결정은 다음 사항에 구속되지 않습니다.
결과적으로 구성된 승인 채널에 게시할 수 있는 모든 사용자는
승인 후 yes를 전송하여 보류 중인 고위험 도구 호출을 승인합니다.
메시지가 나타납니다. 동일한 로컬 PoV는 또한 Slack과 Telegram이
메시징 승인 백엔드에는 명시적인 승인자 허용 목록 매개변수가 없지만
주요 보고서 등급 문제는 Discord 백엔드의 스레드되지 않은 채널입니다.
누화: 승인 메시지가 응답일 필요는 없습니다.
요청에 묶여 있습니다.
MervinPraison/PraisonAIpippraisonaisrc/praisonai/praisonai/bots/_discord_approval.pysrc/praisonai/praisonai/bots/_slack_approval.py
-src/praisonai/praisonai/bots/_telegram_approval.py4.6.58원산지/메인 태그 검증됨: v4.6.58제안된 영향 범위:
``텍스트 pip:praisonai >= 4.5.2, <= 4.6.58
대표적인 로컬 스윕:
``텍스트
4.5.0 Discord 승인 백엔드가 없습니다.
4.5.2 취약함
4.5.128 취약
4.6.9 취약함
4.6.10 취약함
4.6.56 취약함
4.6.57 취약함
4.6.58 취약함
DiscordApproval.request_approval()은 구성된 승인 메시지를 게시합니다.
채널을 탐색하고 반환된 메시지 ID를 기록합니다.
_poll_for_response()는 다음을 사용하여 채널 기록을 폴링합니다.
``파이썬 f"/channels/{channel_id}/messages?after={message_id}&limit=10"
봇이 아닌 이후의 각 메시지에 대해 `content`를 읽고 텍스트를 분류한 다음
텍스트가 `approve`/`yes`인 경우 `ApprovalDecision(approved=True)`를 반환합니다.
해당 메시지가 승인 메시지에 대한 디스코드 답변인지 확인이 되지 않으며,
요청별 스레드에 속하거나 의도된 승인자로부터 왔거나
요청별 승인 토큰이 포함되어 있습니다.
`origin/main`의 중요한 출처 증거:
- `_discord_approval.py` 라인 57-73: 생성자는 `토큰`을 허용합니다.
`channel_id`, `timeout`, `poll_interval`; 승인자 허용 목록이 없습니다.
- `_discord_approval.py` 라인 239: 승인 후 모든 메시지를 폴링합니다.
구성된 채널에 메시지가 표시됩니다.
- `_discord_approval.py` 라인 252-265: 봇 메시지를 건너뛰고,
남은 텍스트를 확인하고 키워드가 `approve`일 때 승인합니다.
Slack 및 Telegram 백엔드는 Discord보다 요청 범위가 더 좋습니다.
- Slack은 승인 메시지 스레드에 `conversations.replies`를 사용합니다.
- 텔레그램은 콜백/답장 메시지 ID를 확인합니다.
그러나 둘 다 여전히 명시적인 승인자 ID 매개변수가 부족합니다. 그들은
권한 부여 모델은 PoV에 포함되어 수정 사항을 제안해야 합니다.
모든 메시징 승인 백엔드에서 일관됩니다.
## 로컬 PoV
최신 로컬 결제에 대해 실행:
``배쉬
python3 poc/pov_prai_cand_029_messaging_approval_channel_member_bypass.py \
--repo ../../artifacts/repos/praisonai-v4.6.58 \
--json
PoV는 로컬 전용입니다. Slack, Telegram 및 Discord API 도우미를 조롱합니다. 처리 중이며 해당 서비스에 연락하지 않습니다.
Discord의 경우 모의 시퀀스는 다음과 같습니다.
DiscordApproval은 중요한 execute_command 승인 요청을 게시합니다.
D_APPROVAL_CHANNEL.DiscordApproval은 approved=True 및 approver="D_INTRUDER"를 반환합니다.evidence/pov-v4.6.58.json에서 관찰된 출력:
``json { "approval_from_unconfigured_channel_participant": { "불화": 사실, "느슨함": 사실, "전보": 사실 }, "백엔드": [ { "백엔드": "불화", "configured_channel_id": "D_APPROVAL_CHANNEL", "결정_승인": 사실, "decision_approver": "D_INTRUDER", "decision_reason": "침입자가 Discord를 통해 승인했습니다", "intruder_user": "D_INTRUDER" } ], "no_explicit_approver_allowlist_parameters": 사실, "취약한": 사실 }
승인 요청의 명령은 무해한 로컬 파수꾼입니다.
'/tmp/prai-cand-029'를 터치하세요. PoV는 승인 결정에서 중지됩니다. 그렇지 않다
도구를 실행합니다.
## 이것이 의도한 동작이 아닌 이유
이 보고서는 고의적으로 개인 승인 채널이 다음과 같다고 주장하지 않습니다.
신뢰할 수 있는 승인자만 그 자체로는 안전하지 않습니다. 더 좁은 문제는
Discord 백엔드는 관련 없는 이후 채널 메시지를 승인으로 처리합니다.
특정 위험한 도구 요청에 대한 결정.
PraisonAI의 승인 문서에서는 승인을 안전 제어로 설명합니다.
위험한 도구 앞에서 잠시 멈추고 인간이나 채널에 허용 또는 거부를 요청합니다.
특정 요청. 채널에서 나중에 무작위로 '예'가 나왔다는 것은 다음의 증거가 아닙니다.
의도된 승인자가 해당 요청을 검토했습니다.
기존 Slack 및 Telegram 구현에는 이미 요청 바인딩이 표시되어 있습니다.
Discord에 없는 패턴:
- 승인 메시지 타임스탬프에 대한 응답을 위한 Slack 범위입니다.
- 텔레그램은 콜백/응답 `message_id`를 확인합니다.
Discord 백엔드는 최소한 동일한 요청 바인딩을 제공해야 하며
채널이 있는 배포에 대한 명시적인 승인자 신원 확인도 지원합니다.
회원 자격은 승인 권한보다 광범위합니다.
## 영향
애플리케이션이 쉘과 같은 위험한 도구에 `DiscordApproval`을 사용하는 경우
명령, 파일 쓰기, 삭제, 배포 또는 기타 권한 있는 작업
구성된 승인 채널에 대한 쓰기 액세스 권한이 있는 낮은 권한의 Discord 사용자
보류 중인 위험한 도구 실행을 승인할 수 있습니다.
이로 인해 코드 실행, 파일 수정, 배포 변경 또는 데이터가 발생할 수 있습니다.
어떤 도구에 따라 PraisonAI 프로세스의 권한으로 액세스
에이전트는 승인 뒤에 노출됩니다.
공격자에게는 LLM API 키, 셸 액세스, 저장소 액세스 또는
PraisonAI 프로세스 접근. 승인을 받은 것처럼 보이는 게시물만 게시할 수 있으면 됩니다.
승인 프롬프트가 나타난 후 구성된 승인 채널에 메시지가 표시됩니다.
## 심각도
권장 심각도: 높음.
근거:
- 'AV': 공격자는 네트워크로 연결된 Discord 채널을 통해 상호 작용합니다.
- `AC`: 승인 프롬프트 후 `yes`를 보내는 것으로 충분합니다.
- `PR`: 공격자가 구성된 승인에 게시하려면 권한이 필요합니다.
채널이지만 승인자별 권한은 없습니다.
- `UI`: 메시지가 나타난 후에는 별도의 피해자 상호작용이 필요하지 않습니다.
- `S`: PraisonAI에서 실행되는 취약한 승인 백엔드 및 승인된 도구
애플리케이션의 보안 범위.
- 'C/I/A': 승인된 위험한 도구는 데이터를 공개, 수정 또는 파괴할 수 있습니다.
구성된 에이전트 도구에 따라 다릅니다.
## 해결
권장 수정 사항:
1. Discord의 경우 단순히 승인이 아닌 요청과 관련된 승인을 요구합니다.
나중에 채널 메시지. Discord 상호작용/버튼을 불투명하게 사용하세요
서버 측 요청 ID를 사용하거나 다음과 같은 Discord 응답이 필요합니다.
`message_reference.message_id`는 승인 메시지와 일치합니다.
2. 모든 메시징 승인에 명시적인 승인자 ID 구성을 추가합니다.
백엔드(예: `approver_user_ids` 또는 `allowed_approvers`)
3. 구성된 승인자 세트 외부 사용자의 승인을 거부합니다.
구성된 채널에 메시지가 나타납니다.
4. 콜백에 요청별 임시값 또는 불투명 승인 ID를 포함하고 확인합니다.
'ApprovalDecision(approved=True)'를 반환하기 전에 서버 측.
5. Discord에 대한 회귀 테스트를 추가합니다.
- 채널에서 관련되지 않은 나중에 'yes'는 무시됩니다.
- 비승인자의 응답은 무시됩니다.
- 허용된 승인자의 요청에 따른 응답/콜백이 성공합니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 88.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 88.00 |
VPI 공식 vpi-v1 기준