본문 바로가기
카테고리 없음

[인코그니토 6주차] CSWSH 공격 대응 방안 분석

by jwk818 2024. 2. 19.

-Oauth 인증 프레임워크를 통한 Access Token 인증

-CSWSH 공격 대응 방안 분석

 

 웹소켓 프로토콜은 웹 클라이언트와 서버 사이의 실시간 양방향 통신을 가능하게 하는 기술로 기존의 HTTP 프로토콜과 달리, 서버가 클라이언트로 데이터를 직접 전송할 수 있게 한다. 그러나, 이 기술은 보안상의 위험도 동반하는데, 특히 크로스-사이트 웹소켓 하이재킹(CSWSH)이 대표적인 취약점으로 꼽힌다.

 웹소켓 연결은 핸드셰이크 과정을 통해 이루어지며, 이 과정에서 'sec-websocket-key' 같은 헤더를 사용하여 클라이언트와 서버 간의 연결을 인증한다. 연결이 성립되면, 클라이언트와 서버는 웹소켓 프로토콜을 통해 데이터를 교환할 수 있다.

 

CSWSH 취약점은 사용자가 신뢰하는 웹사이트에 로그인한 상태에서 악의적인 웹사이트를 방문할 때 발생할 수 있다. 악의적인 웹사이트는 사용자가 이미 로그인한 웹사이트와의 웹소켓 연결을 시도하여, 사용자의 쿠키를 이용해 신원을 위장하고 서버와의 연결을 성립시킬 수 있다. 이를 통해 악의적인 사이트는 데이터를 조작하거나 민감한 정보를 훔친다.

 이러한 취약점을 방어하기 위한 방법으로는 그래픽 인증 코드, Origin 헤더 검증, 무작위 토큰 사용 등이 있다. 그래픽 인증 코드는 사용자 인터랙션을 필요로 하며, Origin 헤더 검증은 브라우저에서만 유효하고 공격자에 의해 위조될 수 있다. 무작위 토큰 방법은 토큰 유출이나 재생 공격에 취약할 수 있다. 따라서 웹소켓을 사용할 때는 이러한 보안 취약점을 고려하여, 적절한 방어 메커니즘을 구현하는 것이 중요합니다.

 

우선 그래픽 인증 코드는 무작위적인 그래픽 코드를 이용한 인증 알고리즘으로, 일반적으로 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)라고 알려져 있다, 인간과 컴퓨터를 구별하기 위해 설계된 자동화된 공개 튜링 테스트이다. 웹 보안에서 그래픽 인증 코드는 자동화된 스크립트나 봇이 웹 사이트의 폼을 제출하거나 서비스를 남용하는 것을 방지하기 위해 사용되고 이 방식은 주로 회원 가입, 로그인, 댓글 작성 등의 웹 폼에 적용된다.

 

  1. 그래픽 인증 코드 생성: 서버는 임의의 문자열을 생성하고, 이 문자열을 그래픽 이미지로 변환한다. 이 이미지는 일반적으로 문자를 왜곡하거나 배경에 잡음을 추가하여 컴퓨터 프로그램이 문자를 인식하기 어렵게 만든다.
  2. 사용자 인터페이스에 표시: 생성된 그래픽 인증 코드 이미지는 사용자에게 표시되고 사용자는 이미지에 표시된 문자를 읽고 입력 필드에 해당 문자를 입력해야 한다.
  3. 검증: 사용자가 입력한 문자열이 서버에서 생성한 원본 문자열과 일치하는지를 검증한다. 만약 일치한다면 사용자는 인간으로 간주되며, 요청이 승인된다. 일치하지 않는 경우, 사용자는 새로운 그래픽 인증 코드를 받게 되며 다시 시도해야 한다.

그래픽 인증 코드는 다양한 형태로 구현될 수 있다. 가장 흔한 형태는 왜곡된 문자를 포함한 이미지이지만 사용자 경험을 개선하고 접근성 문제를 해결하기 위해, 이미지를 클릭하거나 특정 패턴을 그리는 등의 대체 방법도 개발되었다.

그래픽 인증 코드의 주요 장점은 간단하고 비교적 쉽게 구현할 수 있다는 것이다. 그러나, 고급 OCR(광학 문자 인식) 기술의 발전으로 인해 일부 그래픽 인증 코드는 자동화된 시스템에 의해 우회될 수 있다. 이러한 이유로 보다 복잡하고 안전한 방법이 개발되고 있으며, 보안 수준을 높이기 위해 여러 인증 수단을 결합하여 사용하는 추세다.

 

고급 OCR(광학 문자 인식) 기술의 발전은 기본적으로 이미지나 문서에서 텍스트를 추출하고 해석하는 기술의 진보를 의미한다.

  1. 딥 러닝 기술의 적용: 딥 러닝은 특히 이미지 및 텍스트 처리 분야에서 매우 효과적입니다. 고급 OCR 시스템은 딥 러닝 알고리즘을 사용하여 이미지에서 문자를 감지하고 인식하는 데 사용된다. 이를 통해 이전에는 인식이 어려웠던 복잡한 폰트나 손글씨와 같은 다양한 형태의 텍스트도 신속하게 인식할 수 있게 된다.
  2. 문맥 파악 및 언어 모델의 사용: 고급 OCR 시스템은 텍스트를 단순히 문자 단위로 인식하는 것을 넘어서서 문맥을 파악하고 언어 모델을 활용하여 인식된 텍스트의 의미를 더 잘 이해할 수 있다. 이를 통해 인식된 텍스트의 오류를 줄이고 인식 정확도를 향상시킬 수 있다.
  3. 프리프로세싱 및 후처리 기술의 적용: 고급 OCR 시스템은 이미지나 문서를 처리하기 전에 전처리 단계를 거쳐 텍스트 추출의 품질을 향상시킨다. 또한 후처리 기술을 사용하여 인식된 텍스트를 정제하고 오류를 수정합니다. 예를 들어, 문장 분리, 스펠링 교정 및 텍스트 형식화 등의 기술이 사용될 수 있다.

 

두번째로 웹소켓 서버는 연결을 초기화하는 HTTP 요청의 Origin 헤더를 검사하여 요청이 신뢰할 수 있는 소스에서 발생했는지를 확인할 수 있다. 이 방법은 특히, 공개된 API가 아닌 내부 시스템이나, 특정 도메인에서만 접근을 허용해야 하는 경우 유용하고, Origin 헤더는 브라우저에 의해 자동으로 설정되며, 공격자가 이를 조작하는 것은 어렵다. 그러나 이 방법만으로는 모든 위협을 방지할 수 없으며, 추가적인 보안 조치와 함께 사용되어야 한다.

 

세번째는 혼합 암호화 기반의 일회성 무작위 토큰인데, 혼합 암호화 기술을 활용하여 일회성 무작위 토큰을 생성하고 이를 인증 메커니즘에 사용하는 것이다. 이 방법은 대칭키와 비대칭키 암호화를 혼합하여 사용자의 세션을 보호한다. 연결 초기화 단계에서 서버는 클라이언트에게 비대칭키로 암호화된 일회성 토큰을 전송하고, 클라이언트는 이를 복호화하여 서버에 전송함으로써 자신을 인증한다. 이 방식은 중간자 공격을 방지하는 데 효과적이고 토큰의 일회성 덕분에 재사용 공격 또한 방지할 수 있다. 우리가 종종 사용하는 은행의 OTP가 이것을 사용한 방식이다. 

 

  1. 토큰 생성: 서버는 연결을 시도하는 클라이언트에게 대해 고유한 일회성 토큰을 생성한다. 이 토큰은 강력한 난수 생성기를 사용하여 만들어져야 하며, 예측이 불가능해야 한다.
  2. 토큰 전송: 생성된 토큰은 안전한 채널을 통해 클라이언트에 전달되는데, 이 과정에서 SSL/TLS와 같은 기술을 사용하여 데이터 전송의 안전을 보장해야 한다.
  3. 토큰 사용: 클라이언트는 서버로부터 받은 토큰을 사용하여 자신의 요청과 함께 서버에 전송한다. 이때, 토큰은 요청 인증을 위한 증거로 사용된다.
  4. 토큰 검증: 서버는 클라이언트로부터 받은 토큰을 검증한다. 토큰이 유효하고, 이전에 사용되지 않았다면 요청을 승인하고 해당 작업을 수행한다.
  5. 토큰 폐기: 일회성 토큰은 한 번 사용된 후에는 무효화되어 재사용될 수 없고, 이는 재생 공격을 방지하는 핵심 요소이다.

 

일회성 무작위 토큰의 장점

  • 재생 공격 방지: 각 세션 또는 트랜잭션마다 고유한 토큰을 사용하기 때문에, 공격자가 이전 통신을 캡처하고 재전송하는 재생 공격을 방지할 수 있습니다.
  • 예측 불가능성: 강력한 난수 생성 알고리즘을 사용하여 생성된 토큰은 예측하기 어렵습니다. 이는 토큰 기반 시스템의 보안을 크게 향상시킵니다.
  • 향상된 사용자 인증: 일회성 토큰을 사용하면 사용자 인증 과정이 보다 안전해집니다. 토큰은 사용자의 신원을 확인하는 데 사용되며, 토큰 자체가 공격에 취약한 정보를 포함하지 않기 때문입니다.

 

 

마지막으로 OAuth 인증 방식인데 OAuth (Open Authorization)는 인증 및 인가를 위한 개방형 표준 프로토콜이며, 주로 서드파티 애플리케이션이나 웹 서비스에 사용자의 데이터에 대한 접근 권한을 부여하기 위해 사용된다. OAuth 프레임워크를 통한 Access Token 인증은 클라이언트가 사용자의 자격 증명을 제공하지 않고도 서비스에 안전하게 접근할 수 있도록 해준다.

OAuth 작동 방식

  1. 인증 요청(Authorization Request):
    • 클라이언트가 사용자에게 서비스에 대한 접근 권한을 요청한다. 이는 일반적으로 로그인 페이지로 리디렉션되어 사용자가 자신의 자격 증명을 입력하도록 유도한다.
  2. 사용자 인증(User Authentication):
    • 사용자는 서비스에 대한 접근 권한 부여 여부를 확인하고, 클라이언트가 요청한 권한을 승인 또는 거부한다.
  3. 인가 부여(Authorization Grant):
    • 사용자가 권한을 승인하면, 서비스는 클라이언트에게 인증 코드(Authorization Code) 또는 액세스 토큰(Access Token)을 제공한다.
  4. 액세스 토큰 요청(Access Token Request):
    • 클라이언트는 제공받은 인증 코드 또는 다른 정보를 사용하여 액세스 토큰을 요청한다.
  5. 액세스 토큰 발급(Access Token Issuance):
    • 서비스는 클라이언트에게 요청된 정보를 기반으로 액세스 토큰을 발급합니다. 이 액세스 토큰은 클라이언트가 보호된 리소스에 접근할 때 사용된다.
  6. 보호된 리소스 접근(Protected Resource Access):
    • 클라이언트는 발급받은 액세스 토큰을 사용하여 보호된 리소스에 접근한다. 서비스는 액세스 토큰을 검증하고, 클라이언트가 요청한 리소스에 대한 권한 여부를 확인한다.

OAuth 인증 프레임워크의 주요 구성 요소

  1. 리소스 소유자(Resource Owner):
    • 사용자가 자신의 데이터에 대한 접근 권한을 부여하거나 거부할 수 있다.
  2. 클라이언트(Client):
    • 서비스에 접근하려는 애플리케이션 또는 웹 서비스로, 서비스에 대한 액세스를 요청하고 사용자의 권한을 관리한다.
  3. 서비스(Provider):
    • 사용자의 데이터를 호스팅하고 클라이언트에 대한 인증 및 권한 부여를 처리한다. 서비스는 보호된 리소스에 대한 액세스를 관리한다.
  4. 인증 서버(Authorization Server):
    • 클라이언트와 리소스 소유자 간의 인증 및 권한 부여를 처리한다. 보통은 서비스와 같은 시스템 내에 존재하지만, 분리된 인증 서버로 구성될 수도 있다.

장점 

  • 보안: 클라이언트는 사용자의 자격 증명을 공개하지 않고도 서비스에 안전하게 접근할 수 있다.
  • 유연성: 서비스와 클라이언트 간의 권한을 유동적으로 관리할 수 있고, 사용자는 언제든지 애플리케이션에 대한 권한을 취소하거나 변경할 수 있다.
  • 표준화: OAuth는 개방형 표준 프로토콜이므로 다양한 플랫폼 및 서비스 간의 통합이 편해진다.