
OliveTin은 사전 정의된 셸 명령을 최종 사용자에게 노출하기 위한 자체 호스팅 웹 UI입니다. 이 저장소는 OliveTin의 셸 모드 실행 경로에서 두 개의 독립적인 OS 명령 주입 벡터를 입증하는 개념 증명을 포함하며, 두 벡터 모두 애플리케이션의 의도된 셸 인자 안전 검사를 우회합니다.
| CVE ID | CVE-2026-27626 |
| 구성 요소 | OliveTin |
| 취약점 분류 | CWE-78: OS 명령에 사용되는 특수 요소의 부적절한 중성화 |
| CVSS 3.1 | 9.9–10.0 (Critical) — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| 영향 받는 버전 | 모든 버전 ≤ 3000.10.0 (커밋 기준 0.0.0-20260222101908-4bbd2eab1532 이전) |
| 수정된 버전 | 0.0.0-20260222101908-4bbd2eab1532 이후 |
| 권고 | GHSA-49gm-hh7w-wfvf |
| 공개일 | 2026-02-22 (권고), 2026-02-25 (NVD) |
OliveTin은 사전 정의된 셸 명령을 최종 사용자에게 노출하는 자체 호스팅 웹 UI입니다. 이 저장소는 OliveTin의 셸 모드 실행 경로에서 두 가지 독립적인 OS 명령 주입 벡터를 보여주는 개념 증명(PoC)을 포함하고 있으며, 두 벡터 모두 애플리케이션의 의도된 셸 인수 안전성 검사를 우회합니다.
OliveTin은 관리자가 Actions (매개변수화된 인수를 가진 셸 명령)을 정의하여 인증된 (또는 구성에 따라 익명) 사용자가 웹 UI 또는 웹훅을 통해 트리거할 수 있도록 합니다. 사용자가 인수 값을 통해 의도된 명령을 벗어나는 것을 방지하기 위해 OliveTin은 모든 사용자 제공 인수를 checkShellArgumentSafety()를 통해 실행한 후 명령 문자열로 템플릿화하여 sh -c에 전달합니다.
이것이 취약점이 깨는 보안 경계입니다. OliveTin은 '관리자가 명령을 정의'하는 것과 '사용자가 값을 제공'하는 것을 명시적으로 구분합니다. 안전성 검사는 사용자가 인수 값을 임의의 명령을 실행하는 방법으로 전환할 수 없도록 특별히 존재합니다.
password 인수 유형이 검사되지 않음checkShellArgumentSafety()는 고정된 승인 목록의 인수 유형만 검사합니다.
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// BUG: "password" type not checked
return true // Assumes safe
}
password는 민감한 사용자 입력을 수락하기 위한 문서화된 의도된 인수 유형이지만 dangerousTypes에 포함되지 않아 무결 처리되어 return true로 빠집니다. Shell 모드 Action에서 password 유형 인수를 채울 수 있는 모든 사용자는 셸 메타 문자(;, |, `, $() 등)를 주입하여 OliveTin 프로세스 사용자로 임의의 명령을 실행할 수 있습니다.
여기서 악용 가능성은 OliveTin의 기본 설정으로 인해 더욱 증폭됩니다: 자체 등록이 활성화되어 있고 기본적으로 authType: none이므로, 실제 많은 배포에서 '인증된 사용자'는 실제 장벽이 전혀 필요하지 않습니다.
벡터 1과 별개로, OliveTin의 웹훅 핸들러는 수신 웹훅의 JSON 본문에서 임의의 키/값 쌍을 추출하여 ExecutionRequest.Arguments에 직접 주입합니다 (service/internal/executor/handler.go:153-157).
이러한 웹훅에서 파생된 키는 액션의 구성에 정의된 해당 ActionArgument가 없기 때문에 parseActionArguments() (arguments.go)는 검사할 인수 유형을 찾지 못하고 checkShellArgumentSafety()를 완전히 건너뜁니다 — password뿐만 아니라 모든 유형에 대해. 원시 값은 셸 명령에 템플릿화되어 유효성 검사 없이 sh -c에 전달됩니다.
외부/신뢰할 수 없는 소스에서 수신 웹훅을 받는 것은 OliveTin의 주요 지원 사용 사례 중 하나이므로, 이 벡터는 인증이 전혀 필요하지 않습니다.
Shell 모드에서 웹훅으로 트리거되는 Action이 있는 OliveTin 인스턴스는 OliveTin 프로세스의 권한으로 인증되지 않은 원격 코드 실행에 취약하며, OliveTin이 배포된 방식(베어 메탈 대 컨테이너, 부여된 권한 등)에 따라 잠재적으로 전체 호스트가 손상될 수 있습니다.
다음과 같은 경우 OliveTin 인스턴스가 취약할 가능성이 높습니다:
password 유형 인수가 있는 Action이 하나 이상 있는 경우(벡터 1), 또는python3 CVE-2026-27626.py -u <TARGET> [OPTIONS]
0.0.0-20260222101908-4bbd2eab1532 이상으로 업그레이드하십시오.password 유형 인수를 제거하거나 사용하지 마십시오.authType을 none 외의 값으로 설정).| 날짜 | 이벤트 |
|---|---|
| 2026-02-20 | CVE 예약됨 |
| 2026-02-22 | GitHub 보안 권고 게시됨 |
| 2026-02-25 | NVD 공개 |
| 2026-02-27 | 권고 업데이트됨 |
이 PoC는 방어 연구, 탐지 엔지니어링 및 공인된 침투 테스트 목적으로만 게시됩니다. 소유하지 않았거나 테스트에 대한 명시적인 서면 승인이 없는 시스템에 대해 실행하지 마십시오. 이 코드를 타사 시스템에 대해 오용하는 것은 컴퓨터 범죄 법률 (예: 미국의 CFAA, 영국의 Computer Misuse Act 및 기타 국가의 해당 법률)을 위반할 수 있으며, 실행하는 사람의 단독 책임입니다.
Md Saikat (0xh7ml)
| 옵션 | 설명 | 기본값 |
|---|
-u, --url | 대상 호스트/IP | 필수 |
-p, --port | OliveTin 포트 | 1337 |
-x, --cmd | 실행할 명령 | id |