2012-05-21 4 views
6

OWASP CSRF prevention cheat sheet을 읽는 이러한 종류의 공격을 방지하기 위해 제안 된 방법 중 하나는 동기화 기 토큰 패턴입니다.(암호문이 강한) 세션 쿠키를 CSRF 토큰으로 사용해도 괜찮습니까?

세션 토큰이 암호 학적으로 강하면 다음 의사 코드에 설명 된대로 csrf 토큰으로 두 번 사용할 수 있습니까?

클라이언트 :

<script> 
dom.replace(placeholder, getCookie("session-cookie")) 
</script> 

<form> 
<input type="hidden" name="csrf-cookie" value="placeholder-value"/> 
<input type="text" /> 
</form> 

서버 :

쿠키는 우연히 그들이 경우 예를 들어, 세션 쿠키를 누출하지 못하도록하는 페이지로드에 자바 스크립트로 설정되어
if(request.getParameter("csrf-cookie") != user.getSessionCookie()) 
    print "get out you evil hacker" 

그 페이지의 사본을 친구에게 이메일로 보내십시오.

+0

전체 페이지 : 세션 토큰을 CSRF 토큰으로 사용하여 (http://stackoverflow.com/a/10685148/1709587) 임시로 [OWASP에 대한 권고] (http : //stackoverflow.com/a/10686429/1709587) 공격자가 세션 토큰을 직접 획득 할 수 없도록하는 취약점을 통해 사용자의 CSRF 토큰을 획득 할 수있는 현실적인 상황이 있기 때문입니다. 그러한 시나리오는 상관없이 나쁜 것입니다.하지만 세션 토큰을 CSRF 토큰으로 재사용하는 경우 물론 세션 토큰도 손상됩니다. 이는 엄격하게 악화됩니다. –

답변

5

외부 사이트에서 검색 할 수없는 것은 CSRF 토큰으로 사용할 수 있습니다. 그래서 세션 쿠키의 내용은 이것으로 좋습니다.

+1

그게 우리가 의심했던 것입니다. 그러나 나는이 모든 목적을 위해 새로운 토큰을 만들 수 있기 때문에 확신하고 싶었습니다. – Erik

+4

이것은이 페이지에서 유일한 정답입니다. – Tower

+2

OP의 솔루션은 세션 ID에 대해 httpOnly가 설정되지 않은 경우에만 작동하며 이는 권장되지 않습니다. –

6

아니요이므로 세션 토큰을 CSRF 토큰으로 다시 사용하면 안됩니다. CSRF 토큰은 바람직하지 않다으로 세션 식별자를 사용하는 이유 OWASP CSRF 방지 치트 시트는 이유를 제공합니다 :이 방법은 HTTP 매개 변수에 인증 된 세션 식별자를 포함하는 크로스 사이트 요청 위조의 위험을 완화에 효과가

동안 수도 세션 도용의 전체 위험을 증가시킵니다. 건축가와 개발자는 네트워크 어플라이언스 또는 사용자 정의 응용 프로그램 코드 또는 모듈이 HTTP POST 매개 변수를 명시 적으로 기록하거나 공개하지 않도록해야합니다. HTML 내의 세션 식별자

포함될 수도 Http 만 보호를 우회 사이트 간 스크립트 공격에 의해 활용 될 수있다. 대부분의 최신 브라우저는 클라이언트 측 스크립트가 HTTPOnly 쿠키에 액세스하지 못하게합니다. 그러나 클라이언트 측 스크립트가 DOM에서 식별자를 쉽게 트래버스하고 추출 할 수 있기 때문에 HTTPOnly 세션 식별자가 HTML 내에 배치되면이 보호 기능이 손실됩니다. 개발자는이 기사에서 설명한대로 동기화 기 토큰 패턴을 구현하는 것이 좋습니다.

Here 이유는 세션 ID를 CSRF 토큰으로 사용하는 것이 좋지 않을 수 있습니다. This article은 일반 HTTP 연결에서 패킷 스니핑과 잠재적 인 위험으로 중간자 (man-in-the-middle) 공격을 수행하는 기능을 언급합니다.

그러므로 CSRF 토큰이 다른 토큰이어야합니다. 그렇지 않으면 공격자가 이미 세션 식별자를 알고 있다고 가정 할 때 CSRF 토큰을 쉽게 추측 할 수 있습니다! 더 많은 방어력을 발휘하십시오. 화재로 플레이하는 것은 좋지 않습니다. 세션 ID를 CSRF 토큰으로 다시 사용할 필요가 없습니다. 그렇게하면 잠재적으로 악용 될 수있는 또 다른 공격 화면 만 열리게됩니다. 재사용이 필요없고 걱정할 필요가 없습니다.

결과적으로 세션 토큰이 암호 적으로 안전함에도 불구하고 위의 가정 하에서 모든 것이 작동하기 위해서는 CSRF 토큰과는 별도로 (또한 확률적인 의미에서) 독립적이어야합니다. 또한 구현 예제가 항상 처음부터 토큰을 만드는 이유이기도합니다.

암호로 안전한 난수 생성기를 사용하여 일련의 바이트를 만들고 16 진수 또는 16 진수로 인코딩하여 페이지에 삽입 할 문자열을 얻을 수 있습니다. OWASP은 64 비트의 엔트로피 (예 : 16 바이트 16 진수 문자열로 변환 된 8 개의 임의 바이트)를 가정 할 때 128 비트의 길이를 권장합니다. 해당 시퀀스의 길이는 보안 수준을 결정합니다. 10 바이트 보안 임의 숫자 (80 비트의 엔트로피)가 2^(- 80) 확률로 성공합니다. 이는 대부분의 응용 프로그램에서 충분합니다. 따라서 마지막 토큰의 길이는 20 바이트 여야하며 10 바이트 임의의 숫자는 16 진수 인코딩으로 변환됩니다.

관련 문제