비밀번호 이메일은 가역성을 증명할 뿐 저장 방식은 아니다
현재 비밀번호를 이메일로 보내는 서비스는 비밀을 복원할 수 있음을 보여 주었을 뿐, 어떤 알고리즘을 쓰는지는 밝히지 않았다. 재설정은 권한 부여를 중심으로 설계하라.
사용자의 현재 비밀번호를 이메일로 보내는 서비스는 보낼 수 있는 형태로 그 비밀을 얻을 수 있다는 한 가지를 증명했다. 그러나 어떤 컬럼, 알고리즘, 라이브러리가 그것을 만들었는지는 증명하지 못했다. 이 구분이 중요한 이유는 발견 자체는 사실이지만 사람들이 거기서 끌어내는 결론은 대개 지나치게 구체적이기 때문이다. 경로 어딘가의 가역성이 기제이며, 추측한 저장 형식은 그렇지 않다.
증거를 그 수준에 두면 검토의 나머지도 정확하게 유지된다.
오래된 비밀을 되돌려 보내는 것이 증명하는 것
일방향 검증기는 되돌릴 수 없도록 설계되었기 때문에 원래 비밀번호를 만들어 낼 수 없다. 서비스가 비밀번호를 이메일로 보낼 수 있다면, 그 순간 비밀번호를 복원할 수 있는 자료를 보유하거나 해시하기 전에 평문을 가로채 저장한다. 어느 쪽이든 복원 경로는 가역적이며, 이는 진짜 보안 발견이다. 같은 데이터베이스가 다른 컬럼에 비용이 큰 해시를 쓰는지에 대해서는 아무 말도 하지 않는다.
중간 사례도 주목해야 하는데, 애플리케이션이 보유한 키로 암호화해 저장한 블롭은 보고서에서 암호화라는 단어가 안심을 주더라도 실제로는 가역적이다.
왜 이것이 저장 지도가 아니라 설계 발견인가
이메일은 복원 가능성을 증명하며 정확한 방식을 밝히지 않는다. 평문일 수도 있고, 결정적 암호화, 공급업체의 난독화 루틴, 복원 전용으로 쓰이는 별도 자격 증명 저장소일 수도 있다. 제품의 서로 다른 부분은 흔히 서로 다른 저장을 쓴다. 이메일 한 통을 근거로 알고리즘을 지정하는 것은 다음 회의에서 무너지는 종류의 주장이다.
말할 수 있는 것은 더 좁고 더 유용한데, 이 경로가 비밀을 복원할 수 있으므로 제품은 복원 가능한 자격 증명이 존재하지 않는다고 주장할 수 없다. 그 이상의 모든 것은 운영자의 증거를 필요로 한다.
재설정을 권한 부여 중심으로 설계하라
재설정은 요청자가 새 비밀번호를 고를 수 있음을 증명한다는 다른 문제를 푼다. 이에 관한 OWASP 지침은 적절한 만료를 가진 안전하게 생성된 일회용 토큰이나 코드를 설명하고, 요청 단계를 열거와 홍수로부터 보호해야 할 것으로 다룬다. 인증되지 않은 요청이 그 자체로 계정을 바꾸어서는 안 된다. 교체를 받아들이기 전에 권한을 검증하고, 한 번 성공적으로 사용한 뒤에는 토큰을 쓸 수 없게 하라.
이메일 경로는 보안 모델의 일부다. 계정 이름을 보유하는 것은 아무것도 증명하지 않으며, 계정 존재 여부를 드러내는 재설정 흐름은 공격자에게 작업할 목록을 준다.
비밀번호가 보호하던 것을 무효화하라
비밀번호를 바꾸어도 그 비밀번호가 부여한 접근이 자동으로 끝나지는 않는다. 활성 VPN 세션, 기억된 기기, 서버가 발급한 토큰은 각자 다른 무효화 동작을 가질 수 있다. 재설정이 모든 곳에서 로그아웃시켰다고 가정하는 사용자는 흔히 틀리므로, 그중 무엇이 끝나야 하는지 의도적으로 정하고 구현이 그렇게 하는지 검증하라. 그 결정을 흐름과 함께 기록하라.
운영자에게는 어떤 구성 요소가 요청을 검증하고, 어느 것이 자격 증명을 바꾸며, 관련 세션이 어떻게 처리되는지 문서화하라고 하라. 사용자에게는 정당한 복원 경로를 보호하고 비밀번호를 돌려보내는 모든 메시지를 의심스러운 것으로 취급하라고 하라.
정확한 평가는 메시지가 무엇을 증명하는지, 무엇이 알려지지 않은 채 남는지, 그리고 복원이 통제된 절차를 통해 접근을 대체하는지로 짧게 정리된다.