FreeScout 초안 처리 경로의 삭제 권한 우회: 취약점 진단 보고서 및 보안 권고
우리 팀이 제보한 FreeScout GHSA-6ff4-3w2c-mjj8을 바탕으로 KISA 주요정보통신기반시설 기술적 취약점 분석·평가 방법의 프로세스 검증 항목을 적용해 진단 기준, 재현 증적, 원인·영향 분석, 보안 조치 및 재점검 기준을 정리했다.
목차 8
우리 팀은 FreeScout 1.8.240 보안 점검 과정에서 대화 삭제 권한이 없는 메일함 구성원이 기존 대화와 메시지 이력을 삭제할 수 있는 권한 우회 취약점을 확인해 FreeScout 측에 제보했다. 해당 취약점은 FreeScout 1.8.241에서 수정됐으며, GHSA-6ff4-3w2c-mjj8로 공개됐다.
이 글은 당시 제보 내용을 공개 가능한 범위에서 취약점 진단 보고서 및 보안 권고 형태로 재구성한 것이다. 진단 기준은 KISA 「주요정보통신기반시설 기술적 취약점 분석·평가 방법 상세가이드」의 웹 애플리케이션 항목을 참고했다.
1. 진단 개요
| 구분 | 내용 |
|---|---|
| 진단 항목 | 초안 처리 경로를 통한 기존 대화 삭제 권한 우회 |
| KISA 대응 항목 | PV(상) 프로세스 검증 누락을 주 항목으로 적용. IN(상) 불충분한 권한 검증은 서버 측 삭제 권한 확인의 보조 항목 |
| 공개 식별자 | GHSA-6ff4-3w2c-mjj8, CWE-863 |
| 위험도 | GHSA 기준 High, CVSS v3.1 8.1. KISA 항목의 ‘상’과 별개의 등급 |
| 영향 범위 | GHSA 기준 FreeScout 1.8.241 미만. 이 보고서의 동적 진단은 1.8.240에서 수행 |
| 수정 버전 | FreeScout 1.8.241 |
| 점검 위치 | 인증된 사용자의 대화 삭제 및 초안 처리에 적용되는 서버 측 권한 검사 |
| 진단 결과 | 취약 — 열람은 가능하나 삭제 권한은 없는 계정으로 기존 대화 및 원래 메시지의 DB 행 삭제 확인 |
| 조치 확인 상태 | 1.8.241의 공개 수정 커밋·릴리스 확인. 수정판 재점검은 수행하지 않음 |
PV 항목은 기능별 권한과 사용자 입력·실행 단계의 흐름을 서버에서 검증하는지 살핀다. 이 사례에서는 기존 대화의 초안 저장과 초안 폐기를 따로 보면 권한 경계가 드러나지 않고, 두 요청 사이에 바뀐 저장 상태를 따라가야 삭제가 설명된다. IN 항목의 대표적인 진단 대상인 타 사용자 권한 탈취는 이번 재현에서 입증하지 않았다. PV·IN 대응은 재현된 취약 동작과 각 항목의 점검 기준을 비교해 이 보고서에서 적용한 분류이다.
2. 점검 대상 및 판단 기준
점검 내용. 기존 대화의 열람 권한과 삭제 권한을 서버가 구분하고, 초안 처리 중에도 원래 이력의 삭제 권한을 유지하는지 확인한다.
점검 목적. 대화의 열람 권한, 초안 편집 권한, 기존 대화의 삭제 권한을 서버가 서로 구분하는지 확인한다. 진짜 공유 초안을 폐기할 수 있는 정상 기능은 이 진단의 취약 조건이 아니다.
| 구분 | FreeScout에 적용한 기준 |
|---|---|
| 점검 대상 | 대화와 초안의 서버 측 상태·권한 검사, 애플리케이션 응답 및 DB 변경 결과 |
| 양호 | 초안 처리 중 기존 대화의 상태와 삭제 권한 경계가 유지된다. 삭제 권한이 없는 사용자의 작업으로 원래 메시지 행이 제거되지 않는다. |
| 취약 | 기존 대화가 초안 상태로 전이되고, 삭제 권한이 없는 사용자의 후속 폐기 요청으로 대화와 원래 메시지 행까지 제거된다. |
| 조치 방법 | 요청 플래그보다 서버에 저장된 대화 상태를 우선하고, 대화 전체를 지우는 경로에 객체별 삭제 정책을 적용한다. 세부 방법은 6절 참조 |
선행 조건. 공격에 사용된 계정은 인증된 비관리자이며 대상 메일함과 대화를 열람할 수 있다. 효과적인 삭제 권한 PERM_DELETE_CONVERSATIONS는 없고 대화 삭제 정책의 결과도 거부여야 한다. 열람할 수 없는 대화나 다른 메일함으로의 접근은 이 진단에서 입증하지 않았다.
3. 진단 환경과 증적 범위
공식 FreeScout 1.8.240 소스, PHP 8.3.35, MariaDB 11.4.13으로 별도 로컬 Docker 환경을 구성했다. 합성 관리자·일반 사용자·고객과 합성 대화만 사용했으며 운영 서비스나 실제 고객 데이터는 점검하지 않았다. 일반 사용자의 열람 결과는 true, 삭제 권한과 대화 삭제 정책 결과는 모두 false였다. 대화 ID 1에는 처음부터 일반 상태의 메시지 ID 1·2가 있었다. 아래 ID는 이 임시 환경의 값이다.
4. 검증 결과 및 증적
검증에서는 같은 일반 사용자의 권한 판단과 대화·메시지의 변경 결과를 대조했다. 정상 삭제는 권한 오류로 거부됐고, 초안 처리 과정에서는 원래 이력이 제거되는 차이가 확인됐다.
| 확인 항목 | 관찰 결과 |
|---|---|
| 대상 대화의 열람 | 허용 |
| 일반 삭제 권한 및 정책 | 거부 |
| 정상 삭제 이후 원래 이력 | 유지 |
| 초안 처리 과정의 상태 경계 | 기존 대화가 초안으로 취급됨 |
| 최종 대화·메시지 행 | 원래 메시지를 포함해 소실 |
정상 삭제가 거부됐을 때 HTTP 상태는 200이었으므로, 응답 본문과 DB 상태를 함께 확인했다. 최종적으로 원래 대화에 대한 일반 사용자 접근이 실패했고, 공개 전 검증에서 관리자 접근도 HTTP 404를 반환했다.

그림 1. 기존 메시지 두 개가 있는 대화.

그림 2. Drafts 목록에 나타난 기존 대화.

그림 3. 기존 대화가 초안으로 표시된 화면.

그림 4. 원래 대화에 접근할 수 없게 된 상태.
5. 원인 및 영향 분석
서버가 기존 대화의 상태를 판단하는 과정에 클라이언트 입력이 개입했고, 이후 초안 처리에서 대화 전체의 삭제 권한을 충분히 확인하지 않았다. 서로 다른 기능을 거치는 동안 기존 이력을 보호해야 하는 권한 경계가 유지되지 않은 문제다. 공개 권고는 이를 CWE-863으로 분류한다.
확인된 영향은 사용자가 이미 열람할 수 있던 대화와 원래 메시지의 무결성·가용성 손상이다.
6. 조치 방법
6.1 공식 수정 및 운영자 조치
FreeScout 1.8.241에서는 초안 상태가 아닌 기존 대화를 새 대화처럼 초안으로 저장하는 경로를 제한했다. 공식 수정 커밋은 해당 조건을 서버에서 확인해 저장 처리를 중단하는 검사를 추가했으며, 1.8.241 릴리스 노트에도 이 GHSA의 수정이 명시돼 있다.
운영 중인 FreeScout 버전을 확인하고 1.8.241 미만이면 해당 수정이 포함된 버전으로 업데이트한다. 영향 버전 범위와 수정 버전은 공개 GHSA의 기재 내용이다. 삭제 권한을 부여하지 않는 것만으로는 이 경로가 차단되지 않는다는 점은 재현 결과에서 확인했다.
대화 이력 누락이 의심되면 관련 애플리케이션 기록, DB와 백업을 보존해 조사한다. 복원 가능 여부와 실제 영향 범위는 해당 설치 환경의 기록과 백업 정책으로 확인해야 한다. 이 실습은 운영 환경의 탐지율이나 복원 결과를 검증하지 않았다.
6.2 Report에 포함된 보안 권고
다음은 공개 Report의 Remediation 절에 담긴 조치 원칙이다. 1번의 상태 검증은 공식 수정과 연결되지만, 객체별 삭제 정책과 트랜잭션에 관한 권고까지 해당 패치에서 모두 구현됐다는 의미는 아니다.
- 새 초안과 기존 대화를 서버에 저장된 상태로 구분하고, 클라이언트 입력만으로 기존 이력을 폐기 가능한 초안으로 변경하지 않도록 한다.
- 초안 폐기 기능이 대화 전체를 제거하기 전에 진짜 초안 대화인지 검증한다. 기존 일반 대화나 원래 발행된 메시지가 있는 대화라면 일반 대화 삭제 정책과 같은 권한 조건을 적용한다. 기존 대화의 답장 초안만 폐기하는 경우에는 대화 전체가 제거되지 않아야 한다.
- 여러 메시지와 대화를 함께 삭제하는 경우 DB 트랜잭션으로 부분 삭제를 방지한다. 화면의 Discard 버튼 노출 여부와 별개로 서버 엔드포인트에서 권한과 상태를 다시 확인한다.
6.3 보고서의 추가 보안 권고
동일 계열의 상태 전이 기반 권한 우회를 점검하기 위해 권한 매트릭스 구성을 추가로 권고한다. 대화 상태(신규·기존 일반·기존 초안), 사용자 삭제 권한, 동작(저장·초안 폐기·일반 삭제)을 교차해 각 서버 처리 경로의 검증 조건을 대조한다. 이를 통해 한 기능의 상태 변경이 다른 기능의 권한 판단을 우회하는지 확인한다. 이 구성 방법은 공개 제보문의 회귀 테스트 범위를 바탕으로 이 보고서에서 제안한 점검 방식이다.
운영 환경에서 업데이트가 업무 흐름에 미치는 영향은 측정하지 않았다. 정상 초안 기능과 삭제 정책의 재점검 기준은 다음 절에 정리했다.
7. 조치 후 재점검 기준
아래는 패치버전에서 확인해야할 사항이다. 이 문서의 진단 환경에서 1.8.241을 다시 실행한 결과가 아니다.
| 재점검 항목 | 기대 결과 | 확인할 증적 |
|---|---|---|
| 삭제 권한 없는 일반 사용자의 정상 삭제 | 권한 거부. 기존 대화와 원래 메시지 행 유지 | 권한 응답, 삭제 전후 대화·메시지 ID |
| 기존 대화의 초안 처리 | 기존 대화의 상태와 원래 메시지 유지 | 처리 결과와 DB 변경 전후 상태 |
| 기존 대화의 답장 초안 폐기 | 해당 초안만 폐기. 기존 대화와 발행된 메시지 유지 | 초안·원래 메시지 ID의 전후 조회 |
| 진짜 공유 초안 폐기 | 제품 정책에 따라 정상 동작 | 응답과 초안 대화·메시지의 전후 조회 |
| 삭제 권한이 있는 사용자의 일반 삭제 | 기존 삭제 정책에 따라 정상 동작 | 권한 조건, 응답과 DB 상태 |
| 객체별 접근 제한 및 삭제 실패 | 다른 메일함·열람 불가 대화의 접근 제한 유지, 실패 시 부분 삭제 없음 | 권한 응답과 트랜잭션 전후 DB 상태 |
조치 완료 판정에는 응답 문구만 보지 말고 대화 상태와 원래 메시지 행의 유지 여부를 함께 확인해야 한다.
8. 참고 자료와 진단 이력
- KISA 주요정보통신기반시설 기술적 취약점 분석·평가 방법 상세가이드, 2025-12-24 게시본(표지의 판본 표기는 2026). Web Application(웹) PV(상) 프로세스 검증 누락(739
740쪽)을 주 기준으로, IN(상) 불충분한 권한 검증(733734쪽)을 보조 기준으로 참고했다. - FreeScout 공개 보안 권고 GHSA-6ff4-3w2c-mjj8.
- 2026-09-12: 팀 제보 1.8.240에서 독립 DB 재현 3회 완료.
- 2026-09-19: 수정판 1.8.241 공개. 2026-09-26: GHSA 공개.