CVE-2026-19583 (Velociraptor 클라이언트 모니터링 권한 검사 누락) 분석

분류: CVE · 웹·서버 · 권한상승 · CVE-2026-19583 · [표준]

엔드포인트 포렌식 도구 Velociraptor는 위험한 작업일수록 별도 권한(EXECVE)을 따로 요구하도록 설계돼 있습니다. 그런데 같은 작업을 “클라이언트 모니터링”이라는 다른 경로로 예약하면, 그 권한 검사 자체가 통째로 빠져 있었습니다. 검사관(investigator) 등급 정도의 제한된 계정으로 로그인한 사용자가 이 우회로를 타면, 감시 대상 엔드포인트에서 임의 명령을 실행할 수 있었습니다.

개요

Velociraptor는 Velocidex가 만들고 Rapid7이 소유한 오픈소스 엔드포인트 포렌식·원격조사(EDR류) 플랫폼입니다. 조사관은 웹 GUI에서 “아티팩트(artifact)“라는 사전 정의된 조사 스크립트를 엔드포인트에 예약해 실행시킵니다. 이 중 일부는 위험도가 높아 별도 권한 없이는 예약 자체가 막혀 있는데, 이번 취약점은 그 방벽이 한 경로에서만 빠져 있었던 결함입니다.

낮은 권한(PR:L)으로 인증된 사용자가 “클라이언트 모니터링(client monitoring)” 설정 경로를 통해 원래 EXECVE 권한이 있어야만 예약 가능한 아티팩트를 올리면, 서버는 이 경로에서 그 권한을 확인하지 않았습니다. 결과적으로 모니터링 대상 Linux 엔드포인트에서 임의 명령을 실행할 수 있습니다. 비인증(pre-auth) 취약점은 아니며, GUI에 로그인할 수 있는 제한된 계정이 출발점입니다.

  • 영향 범위: 0.77.1 이하 전체(해당 기능이 도입된 이후 전 이력). ⚠️미확인 — 리서치 재료는 OSV.dev·GHSA 기준으로 이렇게 정리했으나, NVD 원문 대조는 검색 스니펫에 그쳐 완료되지 않았습니다.
  • 수정 버전: 0.77.2. ⚠️미확인 — 벤더 공식 advisory와 GHSA가 일치하나, 같은 릴리스의 별도 집계 페이지에는 이 CVE 번호가 나타나지 않아(다른 CVE들만 나열) 팩트체커의 재확인이 필요합니다.
  • CWE: CWE-732(Incorrect Permission Assignment for Critical Resource, 중요 리소스에 대한 잘못된 권한 할당). ⚠️미확인 — 독립 트래커(strix.ai, OffSeq) 기준이며 NVD 매핑 직접 대조는 안 됐습니다.
  • CVSS: 3.1 기준 9.9(Critical), 벡터 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:L. ⚠️미확인 — 두 독립 출처(strix.ai, GHSA)가 동일 벡터를 제시하나, 원출처가 같을 가능성을 배제할 수 없어 NVD 벡터와의 직접 대조가 필요합니다. 특히 가용성 영향(A:L)이 원격 명령 실행치고 낮게 잡힌 점은 팩트체크 시 주의 깊게 봐야 합니다.
  • 선행조건: 사전 인증 없음이 아니라, 투자관(investigator) 등급 이상의 인증된 GUI 사용자가 클라이언트 모니터링 아티팩트를 추가할 수 있어야 합니다(PR:L, UI:N).
  • 크레딧: Yuval Miller, Leon Kayaliev(벤더 advisory 명시). ⚠️미확인 — 팩트체커의 원문 재대조 대상.
  • 공개일: 벤더 공식 advisory 페이지는 2026-08-15로, GitHub Advisory·NVD 계열 트래커는 2026-09-10으로 표기해 출처 간 불일치가 있습니다(패치 PR 자체는 2026-08-10 병합). ⚠️미확인 — 정확한 공개일은 팩트체커가 확정해야 합니다.

한 줄 요약: “위험한 작업에는 특별 권한을 요구한다”는 규칙이, 그 작업을 예약하는 두 번째 경로(클라이언트 모니터링)에는 아예 적용되지 않았습니다 — 문 하나는 잠갔지만 옆문은 잠그는 것을 잊은 셈입니다.

기술 배경 — Velociraptor의 아티팩트 권한 모델

Velociraptor는 조사관이 예약할 수 있는 조사 작업을 “아티팩트”라는 단위로 정의합니다. 파일 목록 조회처럼 비교적 안전한 아티팩트가 있는 반면, Linux.Sys.BashShell처럼 엔드포인트에서 임의 명령을 실행하는 아티팩트도 있습니다. 이런 고위험 아티팩트는 일반 조사관 권한만으로는 예약할 수 없고, 별도의 EXECVE 권한을 가진 사용자만 스케줄링할 수 있도록 설계돼 있습니다.

Velociraptor에는 아티팩트를 예약하는 경로가 여러 개 있습니다. 하나는 조사관이 직접 특정 엔드포인트에 아티팩트를 예약하는 일반 경로이고, 다른 하나는 “클라이언트 모니터링(client monitoring)” — 특정 라벨이 붙은 클라이언트 집합에 상시 감시용 아티팩트를 등록해두는 경로입니다. 두 경로 모두 결과적으로 같은 위험한 아티팩트를 엔드포인트에서 돌릴 수 있으므로, 원칙적으로는 둘 다 동일한 권한 검사를 거쳐야 합니다.

CVE 분석 요약 — 어느 코드가 원인인가

리서치 단계에서 벤더 저장소(github.com/Velocidex/velociraptor, Apache License 2.0)의 패치 커밋과 그 부모 커밋을 직접 대조한 결과, 결함은 아래 경로에 있는 것으로 파악됩니다.

  • 파일: services/client_monitoring/client_monitoring.go
  • 함수: 공개 진입점 SetClientMonitoringState(뮤텍스 락만 수행) → 실제 로직 setClientMonitoringState(소문자)
  • 패치 전(취약) 고정 SHA(부모 커밋): 6d7766eb2e133377f3a0f4d818bdf9a8905628c2
  • 패치 커밋 SHA: c0c9dd609140139efcb37c47e2afa79ed57e6c84 (PR #4967, 2026-08-10 병합)

리서치 재료에 따르면 패치 전 setClientMonitoringState에는 감사 로깅용 principal(요청자) 변수만 있고 권한/ACL 검사 코드가 전혀 없었습니다. 즉 일반 예약 경로에서는 EXECVE 권한이 있어야 스케줄링 가능한 Linux.Sys.BashShell 같은 아티팩트도, 클라이언트 모니터링 설정으로 등록할 때는 아무 권한 확인 없이 그대로 통과됐습니다.

패치는 setClientMonitoringState 진입부에 신설 함수(리서치 재료 표기 기준 checkClientMonitoringPermissins)를 삽입해, 모니터링 테이블에 등록되는 모든 아티팩트에 대해 (1) 이벤트 타입 검증과 (2) launcher.CheckAccess를 통한 권한 보유 여부 확인을 거치도록 했습니다. ⚠️미확인 — 정확한 라인번호는 요약 도구를 거친 근사치이며, 팩트체커가 raw.githubusercontent.com에서 재fetch해 바이트 단위로 대조해야 합니다. 또한 같은 PR에는 이 취약점과 무관한 다른 두 건의 버그 수정(노트북 백업 템플릿 이스케이프, TTL 캐시 버그)이 함께 묶여 있어, 이 CVE와 직접 관련된 부분은 클라이언트 모니터링 권한 검사 부분에 한정됩니다.

// 개념용 단순화, 실제 원본 코드 아님 — 라인번호 ⚠️미확인(패치 전 SHA 6d7766e 기준 재확인 필요)
// services/client_monitoring/client_monitoring.go

// 패치 전: 예약되는 아티팩트가 무엇이든 권한을 확인하지 않는다
func setClientMonitoringState(principal string, state *MonitoringState) error {
    // principal은 감사 로그용으로만 쓰이고, 검사에는 쓰이지 않는다
    self.state = state
    return self.saveState() // EXECVE 권한 검사 없이 그대로 반영
}

// 패치 후: 등록되는 모든 아티팩트에 대해 권한을 먼저 확인한다
func setClientMonitoringState(principal string, state *MonitoringState) error {
    if err := checkClientMonitoringPermissions(principal, state); err != nil {
        return err // EXECVE 등 필요한 권한이 없으면 여기서 거부
    }
    self.state = state
    return self.saveState()
}

공격 시나리오 · 영향도 + 대응방안

공격 시나리오 (단계 압축, 완성형 페이로드 없음):

  1. 공격자가 투자관(investigator) 등급 정도의 제한된 계정으로 Velociraptor GUI에 로그인합니다(관리자 권한이나 EXECVE 권한은 없는 상태).
  2. 일반 아티팩트 예약이 아니라 클라이언트 모니터링 설정 화면에서, 원래 EXECVE 권한이 있어야 예약 가능한 아티팩트(예: Linux.Sys.BashShell)를 감시 대상 라벨에 추가합니다.
  3. 서버는 이 경로에서 권한을 확인하지 않으므로 등록이 그대로 승인되고, 해당 라벨이 붙은 Linux 엔드포인트에서 임의 명령이 실행됩니다.

영향도: CVSS 벡터의 S:C(범위 변경)가 시사하듯, 제한된 관리 콘솔 권한이 엔드포인트 임의 명령 실행으로 확대됩니다. Velociraptor가 관리하는 조직 내 다수 엔드포인트가 이 경로에 노출될 수 있어, 파급 범위는 배포된 엔드포인트 수에 비례합니다. 다만 공격 조건상 완전 비인증은 아니며, GUI 계정 하나가 이미 침해되었거나 내부자여야 성립합니다(⚠️미확인 — 정확한 사전조건은 팩트체커가 advisory 원문으로 재확인).

대응방안:

  1. 근본: Velociraptor를 0.77.2 이상으로 업데이트합니다(⚠️미확인·재확인 필요 — 벤더 공지에서 정확한 안전 버전을 재확인할 것).
  2. 차선(즉시 업데이트 불가 시):
    • 투자관 등급 계정에 클라이언트 모니터링 설정 변경 권한을 부여할 때 신중히 심사하고, 꼭 필요하지 않은 계정에서는 회수합니다.
    • EXECVE 권한이 필요한 고위험 아티팩트(Linux.Sys.BashShell 등)를 클라이언트 모니터링 라벨에서 별도로 감시·제한합니다.
  3. 탐지 관점: 클라이언트 모니터링 상태 변경(SetClientMonitoringState 호출) 이벤트를 감사 로그에서 추적하고, EXECVE 등 고권한이 필요한 아티팩트가 이 경로로 등록되는 시점을 이상 징후로 플래그합니다.

결론

위험한 문에는 자물쇠를 달았지만, 같은 방으로 통하는 옆문에는 자물쇠 다는 것을 잊었습니다.

이 부류의 결함이 반복되는 이유는 단순합니다. 같은 작업(위험한 아티팩트 스케줄링)에 도달하는 경로가 여러 개일 때, 권한 검사를 “작업” 단위가 아니라 “경로” 단위로 구현하면 새로 추가된 경로마다 검사를 빠뜨릴 위험이 생깁니다. Velociraptor는 일반 예약 경로에는 EXECVE 검사를 넣어두고도, 나중에 추가된 클라이언트 모니터링 경로에는 같은 검사를 이식하지 않은 것으로 보입니다. 이는 우리가 다뤄온 권한 검사 누락(CWE-732) 계열, 그리고 API·기능이 여러 진입점을 가질 때 발생하는 일관성 없는 인가(authorization inconsistency) 문제와 같은 뿌리를 공유합니다. 정석은 권한 검사를 각 API 핸들러에 흩뿌리지 않고, 상태를 바꾸는 단일 지점(여기서는 실제 상태 반영 직전)에 모아 강제하는 것입니다. 이 한 틈은 패치로 닫혔지만, “같은 자원에 이르는 새 경로를 낼 때 기존 권한 검사를 잊지 않는다”는 교훈은 다음 기능, 다음 API에서 또 시험대에 오릅니다. 그래서 우리는 도구가 아니라 방법을 남깁니다.

References / 참고자료

  1. Velocidex, “Security Advisory: CVE-2026-19583” — 이 글이 재구성한 원 분석(벤더 공식 advisory, 근본원인·영향·패치 정본). https://docs.velociraptor.app/announcements/advisories/cve-2026-19583/
  2. GitHub, PR #4967 “Bugfix: Enforce required permissions on client monitoring” — 패치 원본(코드 diff). https://github.com/Velocidex/velociraptor/pull/4967
  3. GitHub, commit c0c9dd6 — 패치 커밋 diff 직접 확인. https://github.com/Velocidex/velociraptor/commit/c0c9dd609140139efcb37c47e2afa79ed57e6c84
  4. GitHub Security Advisory GHSA-jfjq-fc5j-227m — CVSS·영향 버전·패치 버전 정본. https://github.com/advisories/GHSA-jfjq-fc5j-227m
  5. strix.ai, “CVE-2026-19583: Velociraptor Vulnerability (CVSS 9.9)” — 독립 분석, CVSS 벡터 교차 확인. https://www.strix.ai/cve/CVE-2026-19583
  6. AiCybr, “Velociraptor CVE-2026-19583: Permission Bypass Can Enable Endpoint Command Execution” — 독립 분석, 공격 조건·영향 서술 교차 확인. https://aicybr.com/blog/velociraptor-cve-2026-19583-permission-bypass-command-execution
  7. OSV.dev, “CVE-2026-19583” — 영향 버전 범위·패치 커밋 크로스체크. https://osv.dev/vulnerability/CVE-2026-19583
  8. NVD, “CVE-2026-19583 Detail” — 정본 CVE 레코드. 리서치 단계에서 페이지 렌더링 문제로 본문 직접 확인이 안 됐고 검색 스니펫에만 의존했습니다 — 팩트체크 시 직접 재대조가 필요합니다. https://nvd.nist.gov/vuln/detail/CVE-2026-19583

이 글은 위 원 자료를 우리 관점에서 다시 쓰고 논평을 더한 것입니다. 특정 문장·코드를 그대로 옮기지 않았으며, 자세한 재현 절차는 원문을 참고하세요. ⚠️미확인 표시가 붙은 사실 주장(특히 영향/수정 버전·CWE·CVSS 벡터·패치 라인번호·공개일·크레딧)은 발행 전 독립 팩트체크로 1차출처 대조가 끝나야 확정됩니다. 이 초안은 패치 커밋의 코드 diff를 직접 인용하되, 정확한 라인번호는 요약 과정을 거친 근사치이므로 팩트체커의 raw.githubusercontent.com 재fetch·byte-level 대조가 반드시 선행되어야 합니다.