study/보안

s2n-tls

lucykorea414 2024. 5. 30. 20:17
728x90
  1. OpenSSL은 TLS 프로토콜을 구현한 기존 라이브러리 중 가장 널리 사용되고 있지만, 다음과 같은 문제가 있다.
    • 코드 양이 너무 많고 복잡해서 코드 감시, 보안, 성능, 효율에 문제 발생
    • 약 50만 줄의 코드 중 최소 7만 줄이 TLS 구현 코드
    • 코드 길이가 길수록 오류 발생 가능성이 높고, 버그 발생 시 대응이 어려움
    • 특히 OpenSSL의 Heartbleed 버그는 메모리 누출 문제를 일으키며, 기존 TLS 라이브러리의 문제점을 드러냄
    —> 이에 대응하여 작고 빠르며 안전한 s2n-tls 라이브러리가 개발됨
  2. s2n-tls의 s2n은 signal to noise라는 의미로, C99로 구현된 TLS/SSL 프로토콜 라이브러리이다. 단순하고, 코드 베이스가 작고, 속도가 빠르고, 보안을 우선시하였다는 특징이 있다. s2n-tls는 불필요한 기능을 제거하고 6000줄로 구현되어 있으며, AWS 서비스에 통합되어 오픈소스 API로 제공된다.

  3. s2n-tls 기능 및 특징
    • features
      • TLS/SSL 프로토콜: SSLv3, TLS1.0, TLS1.1, TLS1.2, TLS1.3
      • 암호화: 128/256-bit AES (CBC, GCM 모드), ChaCha20, 3DES, RC4
      • 전방위 보안: DHE, ECDHE
      • TLS 확장 기능: SNI, ALPN, OCSP
    • safety mechanism
      • 6000줄의 코드
      • 발견된 모든 이슈는 s2n-tls 이슈 트래커에 기록
      • 정적 분석, 퍼즈 테스트, 침투 테스트 수행
      • 유닛테스트, 앤드투앤드테스트
      2) 메모리 보호
      • 메모리 영역이 디스크로 교체되거나 코어 덤프에 나타나지 않도록 운영 체제 기능 활용
      3) 최소 기능 채택
      • 잘 사용되지 않는 옵션 및 확장 기능 구현을 회피, 필수적인 것들만 채태
      • 예: DTLS 미지원
      4) 랜덤 수 생성의 격리
      • 공개 및 비공개 용도의 두 개의 랜덤 수 생성기를 사용
      • 난수 생성 알고리즘의 잠재적 예측 가능성 위험 감소
      5) 모듈화된 암호화
      • 다양한 암호화 라이브러리를 지원
      • OpenSSL (1.0.2, 1.1.1, 3.0.x), LibreSSL, BoringSSL, AWS-LC, Apple Common Crypto 프레임워크
      6) 타이밍 블라인딩
      • 민감한 데이터를 누출하는 시간 기반 사이드 채널 공격 방지 지원
      • 예: TLS 레코드 또는 핸드셰이크 메시지 파싱 실패 시 10~30초 무작위 지연 후 응답
      7) 테이블 기반 상태 기계
      • 간단한 표 형식의 데이터 구조를 사용하여 TLS/SSL 상태 기계를 구현
      • 비정상적인 순서의 상태가 발생하지 않도록 설계
      8) C 안전성
      • C로 작성되었으나 표준 C 라이브러리 함수를 최소한으로 사용
      • 모든 메모리 처리, 문자열 처리, 직렬화 작업은 경계 검사를 통해 감싸서 수행
    • 1) 작고 감시(감사?) 가능한 코드베이스
    1. s2n-tls Operation
      • s2n-tls는 다음과 같은 암호화 라이브러리와 호환되어 사용 가능하다.
        • AWS-LC (권장)
        • OpenSSL
          • 버전: 1.0.2, 1.1.1, 3.0.x(확인 필요)
        • BoringSSL
        • LibreSSL
      • 테이블 기반 상태 기계(state machine) : 상태 기계는 수학적으로 시스템의 동작을 모델링하는 개념으로, 다양한 상태와 그에 따른 전이(transition)를 정의하여 시스템의 동작을 표현한다. 
        • s2n-tls에서 사용하는 simple table은 상태 기계를 구현하는 데 사용되는 간단한 표 형식의 데이터 구조로, 각 표는 현재 상태와 입력에 따른 다음 상태 및 행동을 정의하여 프로그램의 상태 전이 로직을 명확하게 규정한다. TLS/SSL 프로토콜은 여러 가지 상태와 동작을 가지고 있으며, 이러한 상태 및 동작은 데이블로 정의된다.
          • 예를 들어, TLS 핸드셰이크 과정에서 상태와 동작은 다음과 같이 정의된다.
            • 클라이언트가 처음 메시지 Client Hello를 전송
            • 서버는 응답 메시지 Server Hello를 보냄
            • 디피-헬만 키 교환(DHE/ECDHE) 및 서버 인증서 전송을 통해 키 교환 및 인증
            • 완료 - 양측이 Finished 메시지를 교환하고 암호화된 통신이 시작
            • 이러한 상호 작용은 순차적으로 진행되어야 하며, 서버는 클라이언트의 메시지를 먼저 기다려야 한다. 이러한 특성을 활용하여 s2n-tls는 단일 stuffer를 사용하여 클라이언트 및 서버 간의 모든 핸드셰이크 메시지를 관리한다.
              • 핸드셰이크 메시지 처리를 위해 함수 포인터 테이블이 사용되며, 이는 **tls/s2n_handshake_io.c**에 위치, 이를 통해 프로토콜 상태 전이 로직을 체계적으로 관리
      • Message Passing Style : 이는 프로세스나 스레드 간 데이터를 주고받는 프로그래밍 패러다임으로, 각 프로세스나 스레드가 독립적으로 실행되며 필요한 경우에만 데이터를 주고 받는다. s2n-tls의 함수들이 메시지 전달 스타일로 작동한다는 것은 다음과 같은 의미를 갖는다.
        • 비동기적 통신: 함수 간 데이터 전달은 비동기적으로 이루어져 호출자는 메시지를 보내고 다른 작업을 계속 수행 가능
        • 메시지 큐 및 버퍼: 메시지는 메시지 큐나 버퍼에 저장되며 송신자는 메시지를 추가하고 수신자는 이를 가져와 처리
        • 비동기 이벤트 처리: 송신자가 이벤트를 발생시키고 수신자가 해당 이벤트를 처리
      • 이 스타일은 TLS/SSL 프로토콜의 작동을 조율하며 프로토콜 상태의 일관성을 유지하는 데 유용하다.
  • 메모리 handling : Blobs & Stuffers : C 언어는 메모리와 버퍼 처리에 있어 문제점을 가지고 있다. 이를 방지하기 위해 s2n-tls는 C 문자열 함수나 표준 버퍼 조작 방식을 사용하지 않고, 메모리 영역을 명시적으로 추적한다.
    • s2n_blob 구조체
      • 메모리 범위를 관리하는 간단한 데이터 구조체로, s2n-tls에서의 **blob**은 데이터 블록을 의미하며, 주로 정적 또는 동적 메모리 버퍼를 다룰 때 사용한다.
      • 기존 메모리 버퍼를 **s2n_blob_init**으로 초기화하거나 동적 메모리 할당을 통해 관리
      • 사용자 데이터 처리 시 동적 할당을 선호하며, 메모리 영역이 디스크로 교체되거나 코어 파일에 나타나지 않도록 방지
      • Blob의 주요 기능
        1. 메모리 관리
          • 버퍼의 크기와 상태를 명시적으로 추적하고 관리
          • 동적 또는 정적 메모리 할당을 지원하며 메모리 영역을 안전하게 다룸
        2. 버퍼 초기화
          • 이미 할당된 메모리 영역을 추적하거나 동적으로 새 버퍼를 생성 가능
          • 동적으로 할당된 버퍼의 경우, s2n_blob_zeroize 함수로 안전하게 메모리를 초기화하여 민감한 정보를 제거 가능
        3. 크기 변경 및 재할당
          • **s2n_blob**의 크기를 재조정하거나 재할당할 수 있음
    • s2n_stuffer: 스트리밍 버퍼
      • 프로토콜 레벨의 모든 입출력을 메모리 버퍼에 처리하는 핵심 구조체로, 메모리 버퍼를 이용해 프로토콜 레벨의 입력과 출력을 처리
      • 내부적으로는 블롭(s2n_blob)과 두 개의 커서로 구성
        • Blob (s2n_blob): 기본 메모리 버퍼
        • Cursor: 현재 위치를 추적하는 두 개의 커서 (read_cursor와 write_cursor)
        • Growable 플래그: stuffer의 크기를 확장할 수 있는지 여부
      • 모든 연결은 s2n_connection 구조체에 연관되며 TLS 상태가 관리됨
      • **s2n_connection->handshake.io**는 확장 가능한 stuffer로 핸드셰이크 메시지를 관리
      • stuffer의 주요 기능
        1. 데이터 읽기 및 쓰기
          • 데이터를 읽을 때는 **read_cursor**를 사용하고, 쓸 때는 **write_cursor**를 사용
          • 각 커서는 자동으로 적절한 위치로 이동
        2. 크기 확장 및 축소
          • growable 플래그가 활성화된 경우 메모리 버퍼의 크기를 동적으로 조절할 수 있음
          • 메모리 버퍼의 크기를 늘리거나 줄일 수 있음
        3. 프로토콜 상태 관리
          • 핸드셰이크 단계와 같은 TLS 상태를 관리하기 위해 사용됨
          • 예를 들어, **s2n_connection->handshake.io**는 핸드셰이크 메시지 관리에 사용되는 stuffer
    • s2n-tls는 메모리 처리와 프로토콜 동작을 간결하고 안전하게 구현함으로써 TLS/SSL 프로토콜 라이브러리의 효율성과 보안성을 확보하고 있다. s2n-tls에서는 stuffer 구조체를 사용하여 메모리 관리를 간단하고 효율적으로 처리할 수 있다.
      • 명확한 프로토콜 상태 관리: 각 연결에 대한 프로토콜 상태를 명확하게 추적하고 관리
      • 안전한 메모리 처리: 읽기/쓰기 커서로 메모리 경계를 명확하게 처리하여 버퍼 오버플로우 등 문제 방지
      • 동적 크기 조절: 프로토콜 레벨의 입력과 출력에 맞춰 메모리 버퍼의 크기를 조절
    • Blob와 Stuffer의 관계
      • **s2n_stuffer**는 내부적으로 **s2n_blob**을 사용하여 메모리 버퍼를 관리한다. **blob**은 **stuffer**의 핵심 구성 요소로서 다음과 같이 포함되어 있다.
      struct s2n_stuffer {
      	struct s2n_blob blob;      // 실제 데이터가 저장되는 메모리 버퍼
      	uint32_t read_cursor;      // 현재 읽기 위치를 추적하는 커서
      	uint32_t write_cursor;     // 현재 쓰기 위치를 추적하는 커서
      	uint8_t alloced;           // 메모리 할당 여부를 나타내는 플래그
      	uint8_t growable;          // stuffer의 크기를 확장할 수 있는지 여부
      	uint8_t tainted;           // 데이터가 수정되었는지 여부
      };
      
      • **blob**은 **stuffer**의 실제 데이터 저장소로 사용되며, **read_cursor**와 **write_cursor**를 통해 데이터에 접근하고 관리한다.
      • 즉,
        1. Blob (s2n_blob)
          • 버퍼를 관리하는 기본 데이터 구조
          • 정적 및 동적 메모리 버퍼를 관리하는데 사용
        2. Stuffer (s2n_stuffer)
          • 프로토콜 레벨의 입력 및 출력을 처리하는 스트리밍 버퍼
          • 내부적으로 **blob**을 사용하여 메모리 버퍼를 관리하며 커서를 통해 읽기/쓰기를 관리
                                      1.  
728x90

'study > 보안' 카테고리의 다른 글

s2n-tls 설치 및 예제  (0) 2024.05.30
TLS 공부  (0) 2024.05.25
문서형 악성코드 분석 개요  (0) 2024.05.14
랜섬웨어란?  (0) 2024.03.23
[안티디버깅] INT3 (CC 패치)  (0) 2024.02.23