보안
같은 네트워크의 다른 사람, 릴레이 운영자, 웹 페이지로부터 폰을 지키는 장치와, 보호 범위 밖에 있는 것을 설명합니다.
번역된 페이지입니다. 영어 문서와 내용이 다르면 영어 문서가 기준입니다. English
Droidline은 페어링된 폰의 화면을 읽고 조작할 수 있습니다. 이 페이지는 이를 둘러싼 보호 장치와 그 한계를 설명합니다.
페어링: 누가 폰을 제어할 수 있는가
폰은 페어링한 PC의 명령만 받고, PC도 페어링한 폰만 받아들입니다. 페어링 방법은 두 가지입니다.
- QR 코드. PC의 공개 키와 일회용 토큰이 들어 있습니다. 토큰은 10분 동안, 폰 한 대에만 유효하며 평문으로 전송되는 일이 없습니다. 폰은 올바른 키를 유도해 내는 것으로 토큰을 가지고 있음을 증명합니다.
- 6자리 코드. 폰이 양쪽 키에서 유도한 코드를 보여 주고, 사용자가 그 코드를 PC에 입력합니다. 중간에 다른 기기가 끼어들면 양쪽에 서로 다른 코드가 나옵니다.
droidline revoke <device>는 폰의 키를 지웁니다. 그 폰은 다시 페어링해야 접속할 수 있습니다.
핸드셰이크 이후는 모두 암호화
폰과 PC 사이의 모든 줄은 AES-256-GCM으로 암호화됩니다. 키는 두 번의 P-256 키 교환에서 나옵니다. 하나는 연결마다 새로 만드는 키로 하고(그래서 나중에 키가 유출돼도 지난 통신을 복호화할 수 없습니다), 다른 하나는 장기 키로 합니다(그래서 양쪽이 상대가 누구인지 압니다). 같은 와이파이를 포함한 모든 경로에서 마찬가지입니다. Cloudflare를 포함해 터널이나 릴레이가 볼 수 있는 것은 기기 ID, 크기, 시각뿐입니다.
이 설계는 표준 암호 기본 요소(P-256, HKDF-SHA256, AES-GCM)를 Noise KK와 비슷한 패턴으로 조합합니다. 하지만 Noise 구현체는 아니며, 보안 감사를 받은 적도 없습니다. 프로토콜과 테스트 벡터는 공개되어 있습니다.
내 코드 쪽
- 클라이언트 포트는 127.0.0.1에서 대기합니다.
client.listen을 바꾸지 않는 한 다른 컴퓨터에서는 접근할 수 없고, 바꾸면 모든 연결에 클라이언트 토큰(droidline token create)이 필요합니다. 토큰은 해시로 저장합니다. - HTTP 인터페이스는 웹 페이지에서 온 요청(
client.allowed_origins에 없는Origin헤더),Host가 localhost가 아닌 요청(DNS 리바인딩), JSON이 아닌 POST 본문을 거부합니다. 내가 방문한 페이지가 내 폰을 조작할 수 없습니다.
PC에 저장되는 비밀 정보
서버의 개인 키, TLS 키, 릴레이 토큰, 저장된 프록시 비밀번호는 Windows에서는 내 Windows 계정 기준의 DPAPI로 저장되고, macOS와 Linux에서는 내 사용자만 읽을 수 있는 파일에 저장됩니다. 폰은 자신의 개인 키를 Android Keystore에서 나온 키로 암호화해 보관합니다.
보호 범위 밖
- 내 PC 계정을 쓸 수 있는 사람은 누구나 내 폰을 조작할 수 있습니다. 내가 실행하는 다른 자동화 도구와 마찬가지입니다.
- 접근성 서비스는 화면에 보이는 것은 무엇이든 읽을 수 있습니다. 내가 관리하는 폰에만 앱을 설치하세요.
- Droidline은 PIN, 패턴, 비밀번호 잠금 화면을 풀지 않습니다.
문제 제보
취약점은 GitHub로 비공개 제보해 주세요. 저장소에서 Security, Report a vulnerability 순서로 누르면 됩니다. 공개 이슈는 열지 말아 주세요.