중요 작업: 왜 어떤 조작은 두 기기를 다시 요구하는가

·6분 읽기·작성자: SSP Editorial Team
SSP Academy 커버: SSP Enterprise의 중요 작업과 재서명

중요 작업: 왜 어떤 조작은 두 기기를 다시 요구하는가

로그인되어 있습니다. 관리자 역할도 있습니다. "구성원 제거"를 누릅니다 — 그런데 SSP는 마치 처음부터 로그인하는 것처럼 두 기기로 서명하라고 요구합니다.

이것은 마찰을 위한 마찰이 아닙니다. 세션 토큰이 승인할 수 있어야 하는 작업과 그래서는 안 되는 작업 사이에 의도적으로 그은 선이며, 그 선 뒤의 논리는 SSP를 쓰든 쓰지 않든 이해할 가치가 있습니다.

세션은 편의를 위한 것이지 결과를 위한 것이 아니다

세션 토큰은 소지자 자격증명입니다. 서버가 아는 한, 그것을 쥔 사람이 곧 당신입니다. 바로 그 점이 세션을 편리하게 만들고 — 한 번 인증하면 그 뒤로는 자유롭게 행동합니다 — 바로 그 점이 되돌릴 수 없는 결정의 근거로는 형편없게 만듭니다.

세션은 도난당합니다. 크로스사이트 스크립팅 버그로, 잠그지 않은 노트북으로, 악성코드로, 유출된 백업으로, 혹은 그저 공용 사무실에 열어 둔 브라우저로. OWASP의 세션 관리 지침은 세션 탈취를 예외적 사례가 아니라 예상되는 조건으로 다루며, 그렇지 않다고 가정하는 설계는 모두 낙관적입니다.

대부분의 작업에 대해 이것은 받아들일 만한 위험입니다. 대부분의 작업은 되돌릴 수 있기 때문입니다. 볼트 이름 바꾸기, 열람자 추가하기, 알림 설정 조정하기 — 훔친 세션을 쥔 공격자가 이런 일을 한다면, 당신이 되돌리면 됩니다.

어떤 작업들은 그렇지 않습니다. 조직의 소유권 이전은 통제권을 다른 사람에게 넘깁니다. 구성원 제거는 그의 접근을 끊습니다. 조직 삭제는 최종적입니다. 이런 작업에 대해 SSP는 행위자가 지금 이 순간에도 두 기기를 모두 쥐고 있다는 증명을 요구합니다 — 그날 더 이른 어느 시점에 쥐고 있었다는 것이 아니라.

열세 가지 작업

열세 가지 작업이 재서명을 요구합니다. 네 갈래로 나뉩니다.

조직 통제권

  • 소유권 이전
  • 조직 삭제

구성원과 역할

  • 구성원 제거
  • 구성원을 관리자로 승격
  • 관리자를 강등

계정 정체성

  • 기업 이메일 변경
  • 기업 이메일 제거

볼트 수명 주기와 관리

  • 볼트 보관 처리, 그리고 보관 해제
  • 볼트 동결, 그리고 동결 해제
  • 볼트 관리자 승격, 그리고 강등

이들을 묶는 것은 돈을 옮긴다는 점이 아닙니다 — 어느 것도 옮기지 않고, 옮길 수도 없습니다. 자금을 옮길 수 있는 것은 서명자뿐이기 때문입니다. 이들을 묶는 것은 그 이후에 누가 무엇을 할 수 있는지를 바꾼다는 점입니다. 공격자가 접근을 굳히고, 진짜 소유자를 문밖에 가두고, 훗날의 절도를 조용히 준비하기 위해 원할 법한 작업들이 바로 이것들입니다.

눈여겨볼 것은 이메일 관련 작업이 목록에 있다는 점입니다. 계정의 기업 이메일을 바꾸는 일은 행정적으로 보이지만, 계정 탈취의 고전적인 첫수입니다. 복구 채널을 돌려놓고, 그다음엔 느긋하게 작업하는 것이죠. 여기에 두 기기를 요구하는 것이 그 길을 막습니다.

왜 챌린지를 서버가 쓰는가

메커니즘은 요구 사항만큼이나 중요하고, 한 가지 설계 결정이 그 일의 대부분을 합니다.

당신이 서명하는 메시지는 서버가 생성합니다. 클라이언트는 결코 생성하지 않습니다.

중요 작업, 한 단계씩

클라이언트가 자기 챌린지를 지어낸다면, 침해된 클라이언트는 편리한 것을 지어낼 수 있습니다 — 무해한 작업을 서술한 메시지를, 무해한 일을 한다고 믿은 사용자가 서명하게 하고, 그것을 위험한 엔드포인트에 재생하는 것입니다. 서버가 메시지를 쓴다는 것은, 당신이 서명하는 것이 곧 실행될 것이라는 뜻입니다. 서버는 자기가 발급한 메시지에 대해서만 서명을 검증하기 때문입니다.

이는 SSP가 로그인에 쓰는 것과 같은 방식이며, 일반적으로 서명 기반 인증을 안전하게 만드는 것과도 같은 방식입니다. 검증할 당사자로부터 받지 않은 것에는 결코 서명하지 마세요.

챌린지는 무엇에 묶여 있는가

메시지는 일반적인 "예"가 아닙니다. 네 가지를 담은 구체적인 문자열이고, 그 넷이 합쳐져 가로챈 서명을 다른 어디에서도 쓸모없게 만듭니다.

정확한 작업. remove_membertransfer_ownership은 서로 다른 메시지를 만듭니다. 한쪽에 대한 서명이 다른 쪽을 승인할 수 없습니다.

정확한 대상. 조직, 해당하는 경우 볼트, 그리고 조치 대상이 되는 사람이 모두 메시지 안에 명시됩니다. 볼트 범위의 작업은 볼트 ID를 명시적으로 포함하므로, 한 볼트를 동결하기 위한 서명을 다른 볼트를 동결하는 데 재생할 수 없습니다.

타임스탬프. 메시지의 앞 열세 글자를 차지합니다 — 고정된 위치인데, SSP Wallet이 무엇을 표시하기 전에 그 형식을 검증하기 때문입니다. 챌린지는 15분 뒤 만료됩니다.

무작위 nonce. 12바이트의 암호학적 무작위성으로, 같은 초에 같은 대상에 대한 같은 작업이라도 각 챌린지를 고유하게 만듭니다.

그리고 챌린지는 일회용입니다. 사용될 때 서버는 그것을 검증하는 바로 그 원자적 연산 안에서 사용됨으로 표시합니다 — 그래서 재생된 서명은 조용히 두 번 성공하는 대신 "이미 사용됨"으로 거부됩니다. 만료된 챌린지는 TTL 인덱스가 자동으로 치웁니다.

모든 시도가 기록된다, 실패한 것까지

중요 작업은 영구 로그에 기록되는데, 여기에 지나치기 쉬운 세부가 있습니다. 로그 항목은 챌린지가 요청될 때 기록됩니다 — 작업이 완료될 때만이 아니라.

그 말은 로그에 중도에 포기한 시도, 서명이 실패한 시도, 거절된 시도가 함께 담긴다는 뜻입니다. 실패한 중요 작업 하나는 대개 마음을 바꾼 누군가입니다. 새벽 세 시에 무더기로 나타난 것들은 하나의 이야기입니다.

SSP의 나머지 감사 기록과 마찬가지로, 이 기록에는 만료도 정리 작업도 없습니다. 감사 로그의 가치는 아무도 필요할 줄 예상하지 못했던 부분에 전부 있습니다.

실제로는 어떤 모습인가

시작하기 전에 두 기기를 곁에 두세요. 중요 작업은 기기 하나로 끝낼 수 없고, 챌린지는 15분이면 만료됩니다. 휴대폰이 다른 방에 있다면 먼저 가져오세요.

대시보드만이 아니라 휴대폰에서 작업 내용을 읽으세요. 기기가 보여 주는 메시지는 작업과 대상을 명시합니다. 대상이 당신이 예상한 사람이 아님을 알아챌 기회가 거기 있습니다 — 트랜잭션을 검토할 때 당신을 지켜 주는 것과 같은 습관입니다. 암호화폐 사용자를 노리는 피싱 공격이 두 번째 기기에서의 그 한 번 더 보기가 들이는 몇 초만큼의 값을 하는 이유를 다룹니다.

묶어서 처리하지 마세요. 중요 작업마다 각자의 챌린지와 각자의 서명이 붙습니다. 퇴사하는 세 사람을 제거한다면 서명은 세 번입니다. 이것은 의도된 것입니다. 묶는다는 것은 하나의 서명이 여러 변경을 승인한다는 뜻이고, 그것이야말로 우리가 피하려는 성질입니다.

최악의 순간에 마주칠 것을 각오하세요. 중요 작업은 누군가 떠날 때, 계정이 침해됐을 때, 볼트를 동결해야 할 때 — 즉 사람들이 긴장하고 빨리 처리하고 싶은 순간에 몰립니다. 이 작업들이 두 기기를 요구한다는 것을 미리 알아 두면, 놀랄 일이 절차의 한 단계로 바뀝니다.

무엇이 무엇을 강제하는지에 대한 더 넓은 그림 — 그리고 재서명이 가장 강한 층이 아니라 중간 층에 자리하는 이유 — 은 무엇이 실제로 트랜잭션을 막는가에 있습니다. 조직과 그 볼트들이 어떻게 맞물리는지는 SSP Enterprise: 팀을 위한 멀티시그 볼트에서 시작하세요.

이 글 공유하기

관련 글