GeckoFlag는 고객의 서버에서 직접 운영하는 소프트웨어입니다. 프로젝트 정보를 안심하고 맡기실 수 있도록 개발자가 직접 릴리스마다 보안 검사를 실시하고, 그 내용과 결과를 이 페이지에 공개하고 있습니다.
이 페이지는 개발자의 자체 검사 기록입니다 제3자 기관의 인증이나 감사가 아닙니다. 또한 무엇을 검사했는지도 함께 공개하고 있으므로 도입 여부를 판단하는 자료로 활용하시기 바랍니다.
설계상의 보안 대책
GeckoFlag에는 다음 대책이 기본으로 포함되어 있습니다. 모두 별도의 설정 없이 활성화됩니다.
비밀번호 보호
비밀번호는 평문으로 저장하지 않고 bcrypt로 해시하여 저장합니다. 비밀번호 재설정 토큰도 해시하여 저장하며, 재설정 요청 횟수도 제한합니다.
로그인 시도 제한
로그인 실패를 계정 단위와 접속 IP 주소 단위 모두로 집계하며, 일정 횟수를 초과하면 일시적으로 로그인을 제한합니다. 무차별 대입 공격이나 다수의 계정을 노리는 공격을 억제합니다.
CSRF 대책
모든 양식 제출 시 토큰을 검증하여 외부 사이트에서의 위장 조작을 방지합니다.
XSS 대책
이슈·댓글·위키·노트 등의 리치 텍스트는 HTML Purifier로 허용된 태그만 남긴 후 저장 및 표시합니다. 링크는 http와 https만 허용합니다. AI가 생성한 문장도 모두 같은 처리를 거친 후 저장합니다.
SQL 인젝션 대책
데이터베이스 작업에는 CakePHP 5의 ORM과 프리페어드 스테이트먼트를 사용합니다.
Host 헤더 검증
비밀번호 재설정·초대·알림 이메일에 포함되는 링크는 요청의 Host 헤더가 아니라 등록된 도메인을 기준으로 생성합니다. 부정한 Host 헤더로 이메일 속 링크를 외부 주소로 바꿔치기할 수 없습니다.
파일 보관
이슈의 이미지와 프로젝트의 파일은 공개 폴더 외부에 보관하며, 열람하는 사람이 해당 프로젝트의 멤버인지 확인한 후에 제공합니다. PHP 등 실행 가능한 확장자의 파일은 받지 않습니다.
API 키 암호화
AI 기능용 Claude API 키는 암호화하여 데이터베이스에 저장합니다.
Claude 연동 API 토큰
Claude 연동은 기본적으로 비활성화되어 있으며, 관리자가 기능을 켜고 사용자별로 이용을 허용한 경우에만 사용할 수 있습니다. API 토큰은 해시값만 저장하며 유효 기간을 설정할 수 있습니다. 비밀번호를 변경하면 토큰은 무효가 됩니다. API에서도 화면과 같은 권한을 확인하며, 읽기 전용 토큰으로는 변경할 수 없습니다.
IP 주소 제한
관리자는 접근을 허용할 IP 주소를 제한할 수 있습니다.
설치 프로그램 차단
설정이 완료된 후에는 설치 프로그램 화면에 접근할 수 없습니다.
비공개 폴더 보호
설정·로그·소스 코드 등의 폴더에 대한 직접 접근을 Apache에서는 기본으로 거부합니다(Nginx의 경우 권장 설정 참조).
업데이트 전 자동 백업
소프트웨어를 업데이트하기 전에 자동으로 백업을 생성합니다.
업데이트 파일 서명 검증
공식 업데이트 파일에는 개발자의 전자 서명(Ed25519)이 포함되어 있습니다. 업데이트 전에 서명과 모든 파일의 내용을 대조하며, 변조된 파일이나 공식이 아닌 업데이트 파일은 적용하지 않습니다.
이미지 업로드 검증
아바타·썸네일·로고 등의 이미지는 파일 내용으로 형식을 판별하고 무작위 파일 이름으로 저장합니다. 이미지 저장 폴더에서는 이미지 이외의 파일을 제공하지 않습니다(Apache의 경우). SVG는 받지 않습니다.
보안 헤더
Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy를 전송하여 클릭재킹과 외부 사이트로의 정보 유출을 방지합니다. HTTPS로 운영하는 경우에는 Strict-Transport-Security도 전송하여 브라우저가 항상 HTTPS로 접속하도록 합니다.
세션 관리
로그인할 때마다 세션을 새로 생성합니다. 권한 변경, 계정 삭제, 비밀번호 변경은 로그인 중인 화면에도 즉시 반영됩니다. 이메일 주소와 비밀번호를 변경하려면 현재 비밀번호를 입력해야 합니다.
릴리스별 보안 검사
새 버전을 공개하기 전에 다음 검사를 실시합니다. 검사는 운영 환경과 같은 구성의 검증 환경에서 실시하며, 공개 중인 서비스나 고객의 서버에는 실시하지 않습니다. 최신 버전에서 실시한 내용은 「최신 버전 검사 결과」에 기재되어 있습니다.
| 구분 | 검사 내용 | 사용 도구·기준 | 빈도 |
|---|---|---|---|
| 의존 라이브러리 | 사용 중인 라이브러리에 알려진 취약점이 없는지 확인하고, 사용 라이브러리 목록(SBOM)을 작성 | composer audit, OSV-Scanner, CycloneDX | 릴리스마다 |
| 정적 분석 | 입력값이 위험한 처리에 도달하는 경로(XSS·SQL 인젝션 등)를 소스 코드에서 검출 | Psalm(taint 분석), PHPStan(레벨 5), Semgrep | 릴리스마다 |
| 비밀 정보 혼입 | 비밀번호나 API 키가 소스 코드나 배포 파일에 포함되어 있지 않은지 | gitleaks | 릴리스마다 |
| 동적 스캔 | 관리자와 일반 사용자로 로그인한 상태에서 실제로 공격 요청을 보내 반응을 확인 | Nuclei | 릴리스마다 |
| 권한 검사 | 참여하지 않은 프로젝트의 이슈·파일·노트를 URL의 ID를 바꿔서 조회·조작할 수 없는지 | 자동 테스트(PHPUnit), 수동 확인 | 릴리스마다 |
| 파일 업로드 | 실행 파일, 이미지로 위장한 파일, 경로를 조작하는 ZIP 등이 거부되는지 | 코드 리뷰, 수동 확인 | 릴리스마다 |
| XSS | 이슈 본문·댓글·위키·AI 생성 문장에 공격용 문자열을 입력하여 스크립트가 실행되지 않는지 | 코드 리뷰, 수동 확인 | 릴리스마다 |
| 서버 구성별 확인 | Apache·Nginx 및 공개 폴더 배치 방식별로 설정 파일이나 로그에 직접 접근할 수 없는지 | 수동 확인 | 릴리스마다 |
| Claude 연동 확장 기능 | 확장 기능이 사용하는 라이브러리의 알려진 취약점, API 토큰의 취급, 통신 대상 제한 | npm audit, gitleaks, 코드 리뷰 | 확장 기능 공개 시마다 |
| 체크리스트에 따른 자체 점검 | 인증·세션·입력 검증·오류 처리 등을 항목별로 확인 | OWASP ASVS 5.0 레벨 1 참고, IPA(일본) 「안전한 웹사이트 만들기(How to Secure Your Website)」 | 메이저 버전마다 |
| 공식 사이트 | geckoflag.com의 HTTPS 설정과 보안 헤더 | SSL Labs, Mozilla Observatory | 월 1회 |
심각도 "높음" 또는 "중간"의 문제가 발견된 경우에는 수정 후 재검사를 마칠 때까지 릴리스하지 않습니다. "낮음"은 내용을 확인한 후 수정하거나 영향이 없는 이유를 기록합니다.
의존 라이브러리 업데이트 방침
GeckoFlag가 사용하는 라이브러리(CakePHP 등)의 알려진 취약점은 릴리스마다 확인합니다. GeckoFlag에 영향을 주는 취약점이 발견된 경우에는 다음 기간을 기준으로 수정 버전을 공개합니다.
- 심각도 "긴급"·"높음": 공표 후 14일 이내
- 심각도 "중간": 공표 후 30일 이내
- 심각도 "낮음":다음 릴리스(늦어도 90일 이내)
GeckoFlag의 사용 방식에서는 영향이 없는 취약점이라도 다음 릴리스에서 수정된 버전으로 업데이트합니다. 개발용 라이브러리는 배포 파일에 포함하지 않습니다.
최신 버전 검사 결과: v1.11.0
v1.10.0 이후의 변경 사항(Claude 연동, 서식 있는 텍스트의 글자색·배경색·구분선 등)을 대상으로 검사했으며, 이전 버전부터 포함되어 있던 문제도 함께 수정했습니다. v1.10.0 이하를 사용 중이라면 v1.11.0으로 업데이트할 것을 권장합니다.
| 검사 | 사용 도구(버전) | 검출(높음 / 중간 / 낮음) | 대응 |
|---|---|---|---|
| 의존 라이브러리 | GitHub Advisory Database, FriendsOfPHP security-advisories(2026-10-28 시점의 데이터. 89개 패키지) | 0 / 0 / 0 | 배포 파일에 포함된 라이브러리에 알려진 취약점은 없습니다. 개발용 라이브러리의 알려진 취약점은 v1.11.0에서 업데이트하여 해소했습니다(개발용 라이브러리는 배포 파일에 포함하지 않습니다) |
| 정적 분석·코드 리뷰 | Psalm 5.26.1(taint 분석), PHPStan 2.1.17(레벨 5), Semgrep 1.182.1, 수동 코드 리뷰(v1.10.0 이후 변경 부분: Claude 연동의 API와 토큰, 서식 있는 텍스트, 로그인 유지, 소프트웨어 업데이트. 아울러 모든 화면의 링크 출력) | 1 / 1 / 3 | "높음"·"중간"과 "낮음" 2건을 v1.11.0에서 수정. 남은 "낮음" 1건은 이용자 본인의 조작으로만 발생하며, 영향이 제한적임을 확인. "높음" 1건은 이전 버전부터 포함되어 있던 문제입니다 |
| 비밀 정보 혼입 | gitleaks 8.24.2 | 0 / 0 / 0 | 소스 코드와 배포 파일 모두 확인. 검출된 2건은 모두 오탐(외부 라이브러리 내 샘플 문자열 등) |
| 수정 확인 | 검증 환경(PHP 8.3, MariaDB 10.11, Apache 2.4, Nginx 1.24, Chromium)에서의 동작 확인 | — | 지적 사항마다 수정 전의 문제가 재현되지 않음을 확인 |
| 동적 스캔 | Nuclei v3.11.1(템플릿 v10.5.1). 미로그인·관리자·멤버로 실시 | 0 / 0 / 0 | 문제 없음 |
| 권한 검사 | PHPUnit 12.5(자동 테스트 454건. 이전 내용에 더해, Claude 연동 API가 토큰 없음·읽기 전용 토큰·허용되지 않은 사용자·기능 비활성화의 경우 요청을 거부하고, 참여하지 않은 프로젝트에 접근하지 않음을 확인) | 0 / 0 / 0 | 문제 없음 |
| 서버 구성별 확인 | 수동(Apache 2.4, Nginx 1.24의 공개 폴더 배치 방식 2종류. 설정 파일·로그·세션·저장 파일 등 39개 URL) | 0 / 0 / 1 | 이전 버전의 파일 저장 폴더(files)에 대한 직접 접근을 Apache에서도 모두 거부하도록 v1.11.0에서 수정. 그 외 문제 없음 |
| 체크리스트 | OWASP ASVS 5.0 레벨 1(70개 항목) | 대상 56개 항목 중 50개 항목 충족 | 이번에는 재검토하지 않음(이전 v1.10.0 결과를 승계) |
| Claude 연동 확장 기능 | npm audit, gitleaks 8.24.2, mcpb validate, 수동 코드 리뷰(geckoflag-1.0.0.mcpb) | 0 / 0 / 0 | 배포 파일에 포함된 라이브러리에 영향을 주는 알려진 취약점은 없습니다. API 토큰의 취급과 통신 대상 제한(HTTPS만 허용·리디렉션을 따르지 않음)을 확인 |
이전 버전을 포함한 모든 버전의 검사 결과는 「이전 검사 결과」에 정리되어 있습니다.
검사하지 않는 범위
위의 검사에는 다음과 같은 한계가 있습니다. 도입을 검토하실 때는 이 점도 함께 확인하시기 바랍니다.
- 제3자의 검사는 받지 않았습니다. 외부 전문가에 의한 소스 코드 리뷰나 침투 테스트는 현재 실시하지 않았습니다.
- 고객의 서버 환경은 검사 대상이 아닙니다. OS, 웹 서버, PHP, 데이터베이스의 설정이나 업데이트 상황에 따라 안전성은 크게 달라집니다.
- 모든 호스팅 환경에서 확인한 것은 아닙니다. 검사한 구성은 「최신 버전 검사 결과」에 기재된 것에 한정됩니다.
- 외부 서비스는 대상이 아닙니다. AI 기능에서 이용하는 Anthropic의 API, Claude 연동에서 이용하는 Claude 데스크톱 앱, 메일 발송 서버 등의 안전성은 각 제공업체에 따릅니다.
- 자동 도구로 검출되지 않는 문제에 대하여. 도구가 검출하지 못하는 종류의 문제(비즈니스 로직의 결함 등)는 수동 검사로 보완하고 있지만, 모든 것을 망라할 수 있는 것은 아닙니다.
취약점을 발견한 경우의 신고
GeckoFlag의 취약점으로 보이는 문제를 발견한 경우에는 공개된 장소가 아닌 아래 창구로 직접 연락해 주십시오. 모든 신고는 개발자가 직접 확인합니다.
신고 창구: 문의 양식에서 문의 유형 "취약점 신고"를 선택하여 연락해 주십시오
신고 시 포함해 주실 내용
- 대상 버전과 문제가 있는 화면·기능
- 재현 절차(가능한 범위에서)
- 예상되는 영향
- 사용 중인 서버 환경(PHP, 웹 서버 등)
부탁 말씀
- 검증은 본인이 관리하는 환경에서 진행해 주시고, 다른 사람이 운영하는 GeckoFlag나 geckoflag.com에 대한 공격적인 조작은 하지 마십시오.
원하시는 경우 수정 버전의 보안 정보에 신고자의 이름을 감사의 말과 함께 게재합니다.
배포 파일의 SHA-256
다운로드한 파일이 공식 파일과 동일한지 다음 값과 대조하여 확인할 수 있습니다.
| 파일 | SHA-256 |
|---|---|
| GeckoFlag - 1.11.0.zip | 33354ac588c4cb4de2953c3c26a484953c2bb886f38196ba4bcf4fe629648399 |
| geckoflag-1.0.0.mcpb | 44f2c6dfc9f437856d0680920a327820d757a14116064faa6e46ad8a961d0747 |
확인 방법: Windows는 PowerShell에서 Get-FileHash 파일명 -Algorithm SHA256, macOS·Linux는 shasum -a 256 파일명을 실행합니다.
안전한 이용을 위한 권장 설정
GeckoFlag의 안전성은 설치한 서버의 설정에도 좌우됩니다. 다음 설정을 권장합니다.
- 업로드 후 즉시 설치를 완료하기: 설치가 끝나기 전까지는 URL을 아는 사람이라면 누구나 설정 화면을 열 수 있습니다. 파일을 배치한 후에는 즉시 설치를 완료하십시오.
- HTTPS로 운영하기: 로그인 정보와 프로젝트 내용을 암호화하여 통신합니다. 대부분의 공유 호스팅에서는 무료 SSL 인증서를 사용할 수 있습니다. 또한 한 번 HTTPS로 접속하면 브라우저는 이후 1년 동안 해당 주소에 HTTPS로 접속합니다(v1.10.0 이상). HTTPS 사용을 중단할 계획이 있는 경우에는 주의하십시오.
- 공개 폴더(문서 루트)를 webroot로 지정하기: 설정 파일과 로그가 웹에서 보이지 않는 위치에 놓이게 됩니다.
- Nginx를 사용하는 경우 설정 추가하기: Nginx에서는 .htaccess가 적용되지 않습니다. 별도로 비공개 폴더에 대한 접근을 거부하고, 이미지 업로드 위치(webroot/img)에서는 PHP를 실행하지 않도록 설정하십시오. 설정 예시는 매뉴얼(설치)을 참조하십시오.
- 최신 버전으로 업데이트하기: 보안 수정은 최신 버전에 포함하여 제공합니다. 업데이트 파일은 공식 사이트에서 받고 SHA-256을 확인하십시오. v1.10.0 이상에서는 업데이트 전에 서명도 자동으로 확인합니다.
- PHP와 데이터베이스를 지원 중인 버전으로 유지하기: 지원이 종료된 PHP에는 수정이 제공되지 않습니다.
- 관리자 계정 보호하기: 길고 추측하기 어려운 비밀번호를 사용하고, 관리자 권한은 필요한 사람에게만 부여하십시오.
- 사내에서 이용하는 경우 IP 제한 사용하기: "설정"에서 접근할 수 있는 IP 주소를 제한할 수 있습니다.
- 정기적으로 백업하기: 데이터베이스와 업로드 파일을 서버와 다른 장소에 보관하십시오.