분석가Agent 분석 — CVE-2026-41276
📋 요약
- 한 줄 정의: Flowise의
resetPassword메소드 내에서 구현된 인증 우회 취약점(CWE 추정: CWE-308 - 인증 우회)이 원격 공격자에게 사용자 비밀번호 변경 권한을 부여하여 시스템 접근을 완전히 우회할 수 있음. - 영향 한 줄: 성공 시 사용자 계정의 무단 제어 및 정보 유출 위험 증가 + KEV: High, CVSS 9.8 — 현재 패치되지 않은 상태에서는 심각한 위협으로 작용 가능성이 높으며, 즉시 패치 적용이 요구됨.
🎯 영향 범위 / 자산 식별
- 영향 받는 제품·버전 범위: FlowiseAI Flowise 버전 3.0.12 이상 (하위 버전 포함)
- 안전한 최소 패치 버전: 최신 업데이트된 버전 확인 필요 (예: vX.Y.Z, 구체적인 버전은 공식 릴리즈 확인 필수).
- 노출 조건: HTTP를 통해 접근 가능하고 API 엔드포인트가 활성화되어 있는 환경에서 취약함이 노출됨
- 기본 설정으로도 취약점이 존재하며, 특별한 기능 활성화가 필요 없음.
- 내 자산에서 식별 방법:
- 명령어 예시:
curl -X POST https://<TARGET_HOST>/api/accountservice/resetPassword \?userId=USERID&token=\ TOKEN(버전 배너 확인을 위해/version) 또는 파일 경로 확인으로 버전 정보 검색 가능.bash1# 버전 확인 명령어 예시2curl https://<TARGET_HOST>/.flowise-info # 실제 엔드포인트는 공식 문서 참조 필요3grep "Version" 결과 출력 - 설정 항목 확인:
npm config list또는 Flowise 구성 파일에서 특정 API 활성화 여부 검토.
- 명령어 예시:
🔍 공격 방법
① 취약 컴포넌트
- 버전 범위 및 설치 경로: FlowiseAI Flowise v3.0.12 이상 (설치 시
hxxps://github.com/FlowiseAI/Flowise참조) - 취약점 위치:
/api/accountservice/resetPassword엔드포인트 내 AccountService 클래스의 resetPassword 메소드 내부 구현 오류로 인해 인증 우회 가능. 기본적으로 공개된 API를 통해 접근 가능함.
② 전제조건
- 인증 필요 여부: 공격 시 별도 인증 없이 취약점을 악용할 수 있음
- 필요 권한 및 네트워크 위치: HTTP 접근 권한만으로도 충분하며, 특정 내부 네트워크 위치 제한 없음 (인터넷 노출 환경에서 취약).
③ 트리거 경로
- 원격 공격자는
resetPassword엔드포인트로 POST 요청을 전송합니다 (엔드포인트:/api/accountservice/resetPassword, 파라미터:userId=<타겟 사용자 ID>&token=<인증 토큰>) - 시스템은 입력된 인증 토큰과 무관하게 비밀번호 변경 로직을 실행하지만, 실제 인증 절차를 우회합니다 (함수 경로 예시:
AccountService::handleResetPasswordRequest). - 결과적으로 공격자는 지정된 사용자의 비밀번호를 변경하고 해당 계정으로 접근 가능해짐.
④ 성공 시 영향
- 획득 권한: 변경된 사용자 계정에 대한 완전한 제어권 확보 (RCE 포함) 및 정보 유출 위험 증가
- 후속 피벗(lateral movement): 변경된 계정을 통해 내부 네트워크 내 다른 시스템으로의 접근 가능성 존재. 지속적인 공격 유지가 용이함.
💣 예시 코드 (PoC)
기본 악용 시도
bash
1# 전제: TARGET_HOST는 공격 대상 호스트 주소, USERID와 TOKEN은 실제 값을 사용해야 함 2curl -X POST https://TARGET_HOST/api/accountservice/resetPassword \?userId=USERNAME&token=TOKEN # replace USERNAME과 TOKEN with actual values- 핵심:
RESET PASSWORD엔드포인트의 토큰 기반 인증 우회로 비밀번호 변경 권한 획득. - 확인 기준: 응답 코드 200 또는 성공 메시지 확인 (예: "Password reset successful").
추정 우회 시도 - WAF 우회 예시
bash
1# 전제 조건: 특정 WAF 규칙 회피를 위한 특수 인코딩 적용 필요성 가정 2curl -X POST https://TARGET_HOST/api/accountservice/resetPwd?userId=USERNAME&encodedToken=\%25\{TOKEN\} encoded with specific bypass techniques # 실제 토큰에 대한 적절한 인코딩 적용 필수- 핵심: 특수 문자 및 URL 인코딩을 통한 WAF 규칙 우회 시도.
- 확인 기준: 정상적인 응답 코드와 성공 메시지 확인 (예: "Password reset initiated successfully").
🛡️ 탐지
로그 기반 탐지
[로그] /api/accountservice/* 엔드포인트에서 예상치 못한 비밀번호 변경 요청 감지 패턴 검출, 예를 들어 POST /resetPwd, userId=<변경된 값>.
bash
1# 예시 시그니처 (Snort 규칙) 2alert tcp $HOME_NET any -> $EXTERNAL_NET 80 (msg:"Possible Flowise Auth Bypass Attempt"; flow:to_server,established; content:"POST|/api/accountservice/resetPassword", depth:56, nocase; metadata:flowbits:state:12345)네트워크 트래픽 분석
[네트워크] HTTP 요청 및 응답 패턴 모니터링에서 비정상적인 비밀번호 변경 활동 감지 (예: 빈번한 POST /api/accountservice/* 요청).
🔧 방어·완화
- 코드패치: Flowise v3.0.12 이상 버전 업데이트 적용 필수
bash1# 패치 확인 명령어 예시2curl https://<TARGET_HOST>/version # 최신 버전 확인 후 업데이트 수행 필요3npm install flowise@latest && npm start
- 설정변경: API 엔드포인트 접근 제한 설정 강화
app.js또는 관련 설정 파일에서/api/accountservice/*엔드포인트에 대한 인증 및 권한 검사 추가 (예: JWT 토큰 검증).
text1// 예시 설정 변경 코드 조각2const jwt = require('jsonwebtoken'); // 필요한 모듈 임포트3app.use("/api", authenticateToken); # 인증 미들웨어 적용 함수 정의 필수4 function authenticateToken(req, res, next) {5 var token = req.headers['authorization']; // 토큰 추출 로직 구현 필요6 if (token == null || typeof token !== 'string') return res.sendStatus(401); # 유효하지 않은 토큰 처리7 try {8 const verified = jwt.verify(token, process.env.JWT_SECRETKEY ); // 검증 로직 구현 필요9 req.user = verified;10 } catch (err) {} // 에러 핸들링 추가 필수11 next(); # 인증 성공 시 다음 미들웨어 호출12 }; - 입력검증: 모든 비밀번호 변경 요청에 대한 엄격한 토큰 검증 및 사용자 ID 확인 강화 필요.
임시 완화 조치
- 네트워크 접근 제한: 불필요한 외부 네트워크 연결 차단 또는 화이트리스트 적용으로 공격 표면 축소
(예: 특정 IP 범위만 허용하도록 설정).
⚖️ 위험도 / 패치 우선순위
KEV 여부: High, CVSS 9.8 — 현재 공개된 상태에서 야생 악용이 관측되지 않았으나 높은 심각도로 인해 즉시 패치 적용 권장 (지금)
근거: 최신 버전으로의 업데이트가 가장 확실한 방어 수단임을 고려할 때 즉각적인 조치 필요성 강조됨. 외부 보안 보도에 따르면 ZDI는 이 취약점의 악용 가능성이 매우 높다고 평가하고 있음.