Termalin의 보안
Termalin은 SSH 클라이언트입니다. 사용자가 가진 가장 민감한 자격 증명을 다룹니다. 이 페이지는 저희 서버가 무엇을 저장하고, 무엇을 절대 읽을 수 없으며, 왜 서버를 그다지 신뢰하지 않아도 되는지를 — 쉽게 — 설명합니다.
종단 간 암호화, 구체적으로
의미 있는 모든 것은 어디로든 전송되기 전에 내 기기에서 마스터 비밀번호에서 파생한 키로 암호화됩니다 (PBKDF2-HMAC-SHA256, 600,000회 반복 → AES-256-GCM). 마스터 비밀번호는 기기를 절대 떠나지 않습니다. 저희는 사용자의 데이터를 읽을 수 없고, 대신 재설정해 드릴 수도 없습니다. 이는 설계이지 버그가 아닙니다. 대비책은 사용자가 쥐고 있습니다. 선택적으로 복구 코드를 설정하면 비밀번호를 잊더라도 다시 들어올 수 있고, 설정하지 않으면 비밀번호를 잊는 순간 데이터는 사라집니다. 어느 쪽이든, 복구할 수 있는 권한은 저희가 아니라 사용자에게 남습니다.
서버가 보는 것
| 데이터 | 서버가 읽을 수 있나? |
|---|---|
| 내 호스트, SSH 키, 비밀번호, 스니펫(동기화) | 아니요 — 암호화된 blob만 |
| 터미널 세션 녹화(내용) | 아니요 — 암호화된 blob만 |
| 내 마스터 비밀번호 | 전송되지 않음 |
| 계정 이메일 + 비밀번호 | 이메일은 예; 비밀번호는 Argon2 해시로 저장 |
| 녹화 제목과 호스트 레이블 | 아니요 — 녹화와 마찬가지로 마스터 비밀번호로 암호화 |
| 녹화 메타데이터(길이, 크기, AI 에이전트의 개입 여부) | 예 — 목록과 할당량에 사용 |
| 구독 요금제, 기기 이름, 타임스탬프 | 예 |
| 웹 터미널 세션(웹 캐비닛) | 활성 중에는 저희 서버를 거쳐 가며, 저장되지 않음. 호스트, 포트, 사용자 이름은 로그에 남음 |
| AI 앱이 호스팅 MCP 엔드포인트를 통해 실행하는 명령 | 예 — 명령 텍스트는 활동 로그에 남습니다. 출력은 직접 켤 때만, 오직 사용자만 가진 키로 암호화되어 보관됩니다 |
| Connector 서버의 서버 메트릭과 알림 | 예 — 그래프를 그리고 알림을 보내기 위해 필요합니다(개인정보 처리방침(영어) 참고) |
| 키 파생 솔트 | 예 — 솔트는 비밀이 아닙니다. 덕분에 웹 캐비닛이 브라우저에서 키를 파생할 수 있습니다 |
업데이트는 위조할 수 없습니다
자동 업데이트는 오프라인 Ed25519 키로 서명되며, 대응하는 공개 키는 앱 안에 함께 들어 있습니다. 무엇이든 설치하기 전에, 앱은 릴리스 매니페스트의 서명과 설치 파일의 SHA-256을 그 키에 대조해 검증합니다. 여기서 저희 서버는 신뢰받는 주체가 아닙니다. 완전히 장악된 업데이트 서버(또는 DNS/hosts 리다이렉트)라 해도 업데이트를 막을 수는 있어도, 끼워 넣을 수는 없습니다.
앱은 TLS뿐 아니라 서버 자체를 인증합니다
계정 자격 증명을 어디로든 보내기 전에, 앱은 무작위 nonce로 서버에 챌린지를
보냅니다. 서버는 자신의 신원 키로 그것에 서명해야 하며, 이 서명은 앱에 내장된
공개 키로 검증됩니다. hosts 파일이나 DNS 리다이렉트로 도달하거나,
추가 TLS 인증서를 신뢰하도록 설정된 머신으로 위장한 가짜 백엔드는 그 서명을
만들어 낼 수 없으므로, 사용자의 비밀번호를 절대 보지 못합니다.
바이너리에 비밀은 없습니다
데스크톱 앱은 공개 키만 내장합니다. 앱 파일을 들여다봐도 쓸 만한 것은 나오지 않습니다. 유료 기능은 모두 서버 측에서 적용됩니다.
웹 캐비닛, 솔직하게
웹 캐비닛은 마스터 비밀번호로 녹화를 브라우저에서 복호화하며, 비밀번호는 페이지를 절대 떠나지 않습니다. 브라우저 E2E 제품이 모두 공유하는 솔직한 단서: 서버가 그 페이지의 코드를 전달하므로, 장악된 서버는 변조된 페이지를 내려 줄 수 있습니다. 서명된 업데이트를 갖춘 데스크톱 앱이 가장 신뢰도 높은 경로이며, 캐비닛은 편의를 위한 것입니다.
내 컴퓨터에서
- SSH 호스트 키는 처음 사용할 때(TOFU)
~/.termalin/known_hosts에 고정됩니다. - termal.in 계정은 2단계 인증(백업 코드가 있는 TOTP)과 패스키를 지원합니다 — 데스크톱 앱은 브라우저를 통해 로그인할 수 있으므로, 비밀번호가 앱에 닿지 않습니다.
- 녹화는 터미널 출력과 이벤트 마커를 저장하며, 원시 키 입력은 절대 저장하지 않습니다.
가려진 프롬프트에 입력한 비밀번호(
sudo등)는 화면에 표시되지 않으므로 녹화에 남지 않습니다. 터미널이 출력하는 것은 모두 녹화에 포함됩니다. - ‘마스터 비밀번호 기억’(선택 사항, 기본값은 꺼짐)은 OS 키스토어 — Windows DPAPI, macOS Keychain, Linux Secret Service — 로 보호되며, OS 사용자 계정에 묶입니다.
인프라
백엔드는 Cloudflare 뒤 Docker에서 TLS 1.2+(Let's Encrypt 인증서)로 실행됩니다. 데이터베이스는 호스트의 localhost에서만 접근할 수 있고 — 인터넷에 절대 노출되지 않으며 — 백업은 암호화됩니다. 저희는 가능한 한 적게 수집합니다. 분석 SDK도, 광고 추적기도 없으며, 데이터를 판매하지 않습니다.
규정 준수 & 로드맵
저희는 해낸 것보다 더 많은 것을 암시하기보다, 지금 어디에 서 있는지 정확히 말씀드리는 쪽을 택합니다.
| 영역 | 상태 |
|---|---|
| AES-256-GCM 보관함, PBKDF2-HMAC-SHA256, Ed25519 서명 업데이트 | 제공됨 |
| 데이터 최소 수집 + 요청 시 계정/데이터 전체 삭제(GDPR 대응) | 제공됨 |
| 독립적인 제3자 침투 테스트 | GA 전 예정 |
| SOC 2 | 로드맵에 있음 — 진행 상황 문의 가능 |
취약점 신고
발견한 내용, 재현 방법, 생각하는 영향을 적어 security@termal.in으로 이메일을 보내세요(저희 security.txt 참고). 저희는 영업일 기준 3일 안에 접수를 알리고, 문제가 아니라고 판단할 때는 그 이유까지 포함해 결정을 알려 드립니다.
본인 계정에 대해서만 테스트하고, 문제를 입증하는 선에서 멈추고(데이터 유출, 지속성 확보, 서비스 거부, 제3자나 사용자 데이터 접근 금지), 공개 전에 저희에게 합리적인 기간을 주세요. 이 범위 안에서 작업하신다면 그에 대해 법적 조치를 하지 않겠습니다.
저희는 버그 바운티를 지급하지 않습니다. Termalin은 아직 수익이 없는 작은 프로젝트이고 보상 예산이 없습니다. 누군가 주말을 헛되이 쓰게 하기보다 미리 말씀드리는 편이 낫다고 봅니다. 저희가 드릴 수 있는 것: security.txt 감사의 글에 원하시는 이름과 링크로 크레딧을 올리고, 신고 내용을 설명하는 서면 레퍼런스를 드리며, 몇 달치 Pro 라이선스를 드립니다. 발견이 중대하다면 수정이 배포되는 시점도 알려 드립니다.
감사의 글
책임 있게 문제를 신고하고 Termalin을 더 안전하게 만드는 데 도움을 주신 연구자분들께 감사드립니다.
- MD Rabbi Hossain — MCP 인가 흐름의 OAuth 클라이언트 등록 강화(2026년 9월).