3P by GN⁺ | ★ favorite | 댓글 1개
  • Damien Miller가 ssh(1) 클라이언트에 키 입력 사이의 시간 정보를 숨기는 난독화 기능을 커밋함
  • 대화형 트래픽에서 보내는 데이터가 적을 때 고정 간격 전송을 사용하며, 기본 간격은 20ms임
  • 마지막 실제 키 입력 뒤에는 무작위 시간 동안 가짜 chaff 키 입력을 보내 타이밍 패턴을 더 흐림
  • 동작은 새 ssh_config 키워드인 ObscureKeystrokeTiming 으로 제어됨
  • 구현에는 SSH 전송 계층의 새 PING/PONG 확장이 쓰이며, 이후 openssh-portable을 통해 다른 시스템에도 반영될 가능성이 있음

ssh(1) 클라이언트의 키 입력 타이밍 숨김

  • Damien Miller가 ssh(1)키스트로크 타이밍 난독화 지원을 커밋함
  • 이 기능은 키 입력 사이의 시간 간격을 숨기기 위해, 보내는 데이터가 적은 대화형 트래픽을 고정 간격으로 전송하려고 시도함
    • 기본 전송 간격은 20ms
    • 마지막 실제 키 입력 이후에는 무작위 시간 동안 가짜 chaff 키 입력을 전송함
  • ssh_config 키워드 ObscureKeystrokeTiming 으로 동작을 제어함

SSH 프로토콜 확장과 배포 경로

  • 구현은 SSH 프로토콜에 추가된 두 개의 새 전송 계층 메시지를 사용함
    • SSH2_MSG_PING
    • SSH2_MSG_PONG
  • 이 메시지들은 local extensions 번호 공간을 사용하며, "ping@openssh.com" ext-info 메시지와 문자열 버전 "0"으로 광고됨
  • 해당 변경은 “security by trickery”의 한 예로 소개되며, 다음 OpenBSD 릴리스를 기대할 이유로 꼽힘
  • 다른 시스템은 openssh-portable을 통해 이 기능을 곧 보게 될 가능성이 있음

댓글과 토론

Hacker News 의견들
  • 키 입력 타이밍은 1980년대부터 터미널 입출력에서 우려되던 문제였고, 당시에도 stelnet이나 Kerberos 같은 초기 암호화 환경에서 이미 신경 쓰던 부분임
    대부분의 터미널 앱은 비밀번호 입력에 버퍼링된 입출력을 사용하고, 이건 여전히 중요한 보안 기능임
    이 모드에서는 사용자가 Enter를 누르기 전까지 아무것도 반대편으로 전송되지 않아서, 중간자 공격자는 패딩이 있으면 비밀번호 길이조차 추론하기 어려움
    한동안은 사용자가 입력할 때마다 *를 표시하려고 비버퍼 모드로 비밀번호를 받는 앱들이 좋은 먹잇감이었음
    보기에는 멋지고 피드백도 주지만, 비밀번호 입력에서 가장 숨겨야 할 키 입력 속도를 유출함
    비밀번호 입력에는 버퍼링된 입출력을 계속 유지했으면 하고, 이 방식은 SSH가 난독화를 해도 따라가기 어려울 만큼 낫다고 봄
    그래도 SSH가 이 기능을 추가한 건 좋고, 셸이나 편집기 입력처럼 버퍼링할 수 없는 내용 보호에는 도움이 됨

    • 현재 쓰이는, 비밀번호 길이와 무관하게 고정 개수의 별표를 표시하는 방식은 사용자에게 꽤 혼란스러움
      “길이가 틀렸으니 잘못된 것 같다”고 생각해서 저장된 비밀번호의 이점을 없애고 직접 “맞는” 비밀번호를 다시 입력하려 할 수 있음
      과거에는 2자리 해시와 스마일리 같은 시각적 해시를 보여주는 방식도 있었던 것 같은데, 어깨너머로 훔쳐보는 공격에는 오히려 도움이 될 수 있음
    • 1990년대에 Visual Basic 기반 AI 애드온으로 몇 분만 타이핑해도 타자 패턴만 보고 누가 키보드를 치는지 알아낼 수 있었고, 그러면 로그인 과정이 사실상 무의미해졌음
      지금은 터치스크린 로그인에도 손가락 압력, 접촉 면적, 형태를 사용자와 연결하는 식으로 적용할 수 있음
      스와이프나 마우스 움직임까지 데스크톱 OS 맥락에 포함하면, 자기 기기나 계정이 아닌 사용자가 쓰고 있을 때 시스템을 잠글 수 있는 보안 앱도 가능함
      적어도 애인이 내 휴대폰을 뒤진 시점은 기록할 수 있음
    • 비밀번호 기반 SSH 인증은 거의 절대 쓰지 않는 게 맞음
    • 입력을 줄 단위로 버퍼링하는 SSH 클라이언트가 있는지 궁금함
      즉, 입력한 내용이 Enter나 전송 버튼을 누르기 전까지 전송되지 않는 방식임
      예전에 MUD를 활발히 하던 시절에는 이런 Telnet 클라이언트를 썼지만, 이후 써본 SSH 클라이언트에서는 본 적이 없음
      SSH 키 입력 타이밍 유출을 막는 방어로 괜찮고, 어떤 사용 시나리오에서는 기사에 나온 20ms 지연 방식보다 나을 수도 있어 보임
      다만 생각해보니 Linux 셸 자동완성을 위해 Tab을 누를 때도 전송되면 더 이상적일 듯함
    • “대부분의 터미널 앱은 비밀번호 입력에 버퍼링된 입출력을 쓴다”면, 이 패치가 존재한다는 건 OpenSSH가 그렇게 동작하지 않는다는 뜻인지 궁금함
  • 프로 Bridge가 떠오름
    팀을 벽으로 나누고 카드를 창구로 동시에 넘겨서, 타이밍을 통한 의사소통을 막음
    https://youtube.com/watch?v=RVZLNRmO3vo

    • 그래도 스크린을 통해 부정행위를 함
      https://en.wikipedia.org/wiki/Blue_Team_(bridge)#Cheating_an...
      https://en.wikipedia.org/wiki/Fantoni_and_Nunes_cheating_sca...
      https://en.wikipedia.org/wiki/Fisher_and_Schwartz_cheating_s...
      그리고 이건 우리가 아는 것들일 뿐임
      예전에 면접에서 Bridge를 실제로 써먹은 적이 있음
      Bridge에는 파트너가 입찰 외 방식으로 힌트를 주면, 논리적으로 가능할 때 반드시 반대 방향을 택해야 한다는 Active Ethics 규칙이 있음
      디버깅 면접에서 면접관이 답으로 너무 노골적으로 끌고 가려 해서, 그가 말한 대로 하기 전에 생각나는 모든 것을 멈춰서 확인했음
      면접 뒤에 왜 그랬는지 말했고, 더 설명이 필요하면 Active Ethics를 찾아보라고 했음
      그리고 합격했음
    • 사람들이 그냥 인간 상태 기계처럼 정해진 자동자만 수행해야 하고 벗어나면 벌점을 받는다면, 차라리 동전 던지기로 우승자를 정하고 게임을 생략해도 됨
      이건 포수가 투수에게 신호를 보내면 안 된다고 말하는 것과 비슷함
      정보 전달은 게임에 차원을 더하는 인간적 기술이고, 가장 잘하는 쪽이 이기게 두면 됨
    • 레드팀 관점으로 보면 여기에는 악용할 수 있는 인간적 불규칙성이 너무 많음
      1~2비트 정도의 정보는 넘기는 게 그리 어렵지 않아 보임
    • Bridge는 정말 이상한 게임
      파트너와의 비밀 의사소통이 핵심인데, 그 의사소통은 비밀이면 안 됨
      소통은 해도 되지만 소통하면 안 된다는 식이라 아주 묘함
    • 아직도 정보를 전달할 가능성은 있어 보임
      예를 들어 작은 테이블을 장벽 너머로 툭 밀거나 천천히 밀어서 뭔가를 나타낼 수 있음
      영상 오른쪽 위 사람이 첫 번째와 두 번째에 그렇게 넘겼음
  • 이런 타이밍 공격을 다룬 2001년 논문을 소개한 2008년 글이 있음: https://lwn.net/Articles/298833/
    인용된 논문은 “Timing analysis of keystrokes and timing attacks on SSH”이고, 키 입력 타이밍 정보가 입력된 키열에 대한 정보를 유출한다고 분석함
    더 자세한 분석에서는 키 입력 쌍마다 내용에 대해 약 1비트의 정보가 새고, 비밀번호 엔트로피가 문자당 4~8비트 정도라 이 정보가 상당히 의미 있을 수 있다고 함
    오래전에 고쳐진 줄 알았고, 2012년쯤 수정이 들어간 것으로 생각했는데 아직 해결되지 않았다니 꽤 놀라움

  • 언젠가는 키 입력을 숨기기 위해 무작위 데이터로 미리 채운 패킷을 써야 할 수도 있음
    스테가노그래피는 아니지만 꽤 가까운 방식이고, 트래픽 분석을 더 어렵거나 불가능하게 만드는 데도 쓸 수 있을 듯함

    • NSA 등은 수십 년 전부터 그런 방식을 써왔음
      전용 회선이라면 회선을 항상 최대 사용률로 완전히 암호화해 흘리고, 필요할 때만 실제 데이터를 얹는 게 그리 어렵지 않음
    • 이 방식으로 스테가노그래피도 가능함
      무해한 커버 텍스트를 언어 모델이 다시 쓰게 하되, 단어 샘플링에 쓰이는 확률분포를 키에서 파생한 최소 엔트로피 왜곡으로 바꾸는 연구가 있음
      수신 측에서 같은 모델과 키를 쓰면 커버 텍스트를 다시 암호문으로 복호화할 수 있고, 이미지에도 적용됨
      https://openreview.net/forum?id=HQ67mj5rJdR
    • 난수 방송이 떠오름
      전 세계로 계속 숫자를 방송하고, 그 숫자가 누군가에게 의미가 있을 때만 의미가 생김
      세계 정보기관들이 계속 듣고 있다는 걸 뻔히 알면서도 그렇게 함
    • 일부 메시징 프로토콜은 이렇게 동작함
    • SSH 트래픽은 암호화되어 있어서 관찰자에게는 패킷이 이미 무작위 데이터처럼 보임
  • macOS의 Warp 같은 최신 터미널 에뮬레이터가 떠오름
    예를 들어 모든 입력을 로컬에서 받은 뒤 원격 호스트로 한 덩어리로 보내는지 궁금함
    그렇게 하면 원격 호스트에서 수행되는 어떤 raw 모드 입력은 깨질 수 있겠지만, 그런 상황을 감지해 원시 키 입력 스트림으로 전환할 수도 있을 듯함
    [1]: https://warp.dev

    • 일반적으로 SSH로 연결하면 연결 자체는 항상 raw 모드이고, 원격 호스트가 일반적인 방식으로 pty를 처리함
      원격 pty는 줄 단위 모드일 수도 있고 raw 모드일 수도 있음
      특수 셸 통합이 있는 터미널은 보통 원격 호스트에도 해당 통합이 설치되어야 하며, 일부는 이를 꽤 투명하게 처리함
      그래서 mosh가 순수 SSH보다 지연이 큰 연결에서 더 나은 동작을 보일 수 있음
      다만 이 기능은 mosh에는 적용되지 않을 것임
    • “터미널을 위한 AI”를 내세우는 앱이 표준 Unix 도구보다 더 안전하고 사적일 거라고는 상상하기 어려움
      특정 보안 기능, 예를 들어 타이밍 공격 방어 같은 것은 새 도구가 더 잘 막을 수 있고 오래된 표준 도구에는 없을 수도 있음
      하지만 새 도구에서 다른 보안 기능들이 빠질 가능성이 훨씬 크고, “AI”를 추가하면 공격 표면도 훨씬 늘어남
      Warp의 개인정보 보호 주장도 솔직히 믿기 어려움
      요즘 자연어 처리 도구는 거의 클라우드 솔루션 쪽으로 기울어 있고, 그러면 개인정보 보호 가능성은 거의 즉시 0에 가까워짐
    • 특정 보드 속도로 데이터를 받도록 설계된 것이라면, 한 덩어리로 보낸 입력도 그 속도에 맞춰 흘러 들어가지 않을까?
  • 이게 완화하는 위협이 무엇인지 궁금함

    • 도청자는 키 입력 내용을 볼 수는 없지만, 이전에는 각 키 입력이 언제 전송되는지는 볼 수 있었음
      대상의 타자 패턴을 알고 있다면 그 데이터로 내용을 복원할 수 있음
      대상에게 JavaScript가 켜진 브라우저로 내가 통제하는 웹사이트에 입력하게 하거나, 타자 소리를 녹음해서 패턴을 수집할 수 있음
      최근에는 일부 온라인 스트리머들이 키보드 타자 소리를 학습한 AI 모델로 비밀번호를 훔치는 공격을 당하기도 했음
    • 기억이 맞다면 2005년쯤 논문 하나가 있었고, 암호화된 SSH 세션에서 패킷 타이밍을 수집한 인간 타자 통계와 상관시켜 입력 내용을 알아낼 수 있었음
      이 기능은 그걸 막기 위해 잡음을 추가하는 것으로 보임
    • 원래의 취약점 우려는 비터비 알고리즘 사용이었음
      http://www.cs.berkeley.edu/~dawnsong/papers/ssh-timing.pdf [2001]
      기계학습이 추가되면서 오디오 복호화 정확도가 크게 좋아졌으니, 물리적으로 안전하지 않은 장소에서는 조용한 키보드를 쓰는 게 좋음
      https://arstechnica.com/gadgets/2023/08/type-softly-research...
    • 기본적으로 타자 속도를 분석해서 몇 가지 추정을 할 수 있음
      예를 들어 사용자는 보통 비밀번호를 다른 입력보다 더 빨리 치기 때문에, sudo 같은 작업에서 한 번에 몰려 전송된 키 입력 수를 보고 비밀번호 길이를 추측할 수 있음
    • 최근 키 입력 타이밍과 딥러닝으로 사용자를 지문처럼 식별하고, 이 논문에서는 인증에 쓰는 연구가 나왔음: https://www.usenix.org/system/files/usenixsecurity23-piet.pd...
      이 논문 자체의 사용 사례는 보안 위협은 아니지만, 정보 유출로 해석할 수는 있음
  • 지연 시간이 얼마나 추가되는지 궁금함
    특히 예측 불가능한 지연은 소프트웨어 개발 작업에서 가장 큰 스트레스 요인 중 하나임

    • 본문에 바로 나와 있음
      소량의 데이터만 전송될 때 대화형 트래픽을 고정 간격으로 보내며, 기본값은 20ms임
    • 위의 지연 이야기는 사용자 경험에서의 지연, 즉 키를 누른 뒤 결과가 보일 때까지의 지연을 말하는 것으로 보임
      [1]
      Mosh 같은 도구는 체감 지연을 줄이는 데 꽤 도움이 됨
      Mosh는 사용자 키 입력이 로컬에 등록되는 즉시 표시하고, 왕복이 끝나지 않았다는 뜻으로 흐린 색으로 보여줌
      마지막으로 봤을 때는 그랬고, 어쩌면 밑줄이었을 수도 있음
      왕복이 끝나면 문자가 정상 표시됨
      [1] 소프트웨어 개발에서 가장 큰 스트레스 요인이 키 입력 지연이라면 꽤 운이 좋은 편으로 들림
      [2]: https://mosh.org
    • 이 지연은 설계상 예측 가능하지 않나?
  • 실제 커밋 링크: https://github.com/openssh/openssh-portable/commit/7603ba712...

  • 일부는 패킷 타이밍을 측정해 hands-on-keyboard 셸을 네트워크에서 탐지하는 것 같은데, 이 변경이 그런 탐지를 얼마나 방해할지 궁금함

    • 그런 방식은 “보안”을 이유로 암호화를 깨거나 백도어를 넣으려는 다른 기업식 시도들과 같은 길을 갔으면 좋겠음
      보안에 접근하는 방식으로는 정말 잘못됐다고 봄
      자동화 스크립트가 장비에 로그인하는지 알면 좋긴 하겠지만, 더 나은 설계라면 그 정보가 중요하지 않게 만들 수 있음
    • 이걸 쓸 비악의적 사용 사례가 뭐가 있을까?