개발/코더 탈출 17

Thread, 싱글톤 다중 상속 하지말자!

Thread와 싱글톤 상속의 문제점싱글톤과 Thread 클래스를 동시에 상속받는 것은 초기에는 코드가 간단해 보일 수 있지만, 실제로는 런타임 오류와 메모리 관리 문제를 일으킬 수 있는 설계상 큰 위험 요소입니다. 이 두 가지 상속의 문제점과 해결책을 정리해 보았습니다.문제점수명 관리 문제싱글톤 객체는 프로그램이 종료될 때까지 유지되지만, Thread 객체는 독립적으로 실행 및 종료되어야 합니다. 두 객체를 동시에 상속받을 경우, 싱글톤 객체의 수명이 Thread의 종료 타이밍에 영향을 미칠 수 있어 DLL 언로드나 프로그램 종료 시점에서 예기치 않은 문제가 발생할 수 있습니다.컴파일 타임 검증의 부재C++에서는 기본적으로 두 클래스를 상속받는 것에 대해 명시적인 제한이 없기 때문에, 개발자는 이러한 설..

SNI 필드

**SNI (Server Name Indication)**는 클라이언트가 TLS 핸드셰이크 과정에서 서버에 접속할 때 요청하는 서버의 도메인 이름을 명시하는 TLS 확장 필드입니다.SNI는 주로 **하나의 IP 주소에 여러 도메인 이름(웹사이트)**을 호스팅하는 서버에서 사용됩니다. 이를 통해 클라이언트가 접속하려는 도메인 이름을 서버에 전달할 수 있어, 서버는 해당 요청에 맞는 올바른 SSL/TLS 인증서를 제공할 수 있습니다.SNI의 동작 방식:클라이언트가 서버에 연결을 요청할 때, TLS 핸드셰이크를 시작합니다.클라이언트는 Client Hello 메시지를 전송하며, 이 메시지에 SNI 확장 필드를 포함시켜 접속하고자 하는 도메인 이름(예: www.example.com)을 서버에 알려줍니다.서버는 해..

TLS 1.3 vs 1.2

TLS 1.2 vs TLS 1.3 1. 핸드셰이크 과정 TLS 1.2: 핸드셰이크 과정에서 최대 2라운드 트립(Round Trip Time, RTT)이 필요합니다. TLS 1.3: 핸드셰이크가 1라운드 트립(RTT)으로 단축되어, 세션 설정이 더 빠르게 이루어집니다. 2. 암호화 알고리즘 TLS 1.2: 다양한 암호화 알고리즘을 지원하며, 일부 안전하지 않은 알고리즘도 포함되어 있습니다. TLS 1.3: 약한 암호화 알고리즘을 모두 제거하고, AES-GCM, ChaCha20-Poly1305와 같은 강력한 알고리즘만 지원합니다. 3. 암호 스위트 단순화 TLS 1.2: 복잡한 암호 스위트 구성..

T.L.S(Thread Local Storage)

C++ Thread Local Storage (TLS) and GetLastError 1. TLS 설명 C++에서 TLS (Thread Local Storage)는 각 스레드가 고유한 변수를 저장하고 접근할 수 있게 해주는 메커니즘입니다. TLS는 다중 스레드 환경에서 각 스레드가 서로 독립적으로 데이터를 저장할 수 있도록 도와줍니다. thread_local 키워드를 사용하여 각 스레드마다 별도의 변수를 선언할 수 있습니다. 스레드 간 경합을 피할 수 있으므로 동기화 없이 안전한 데이터 처리가 가능합니다. 2. TLS 예제 코드 #include #include thread_local int counter = 0;void..

CFI

**CFI (Control Flow Integrity)**는 프로그램의 제어 흐름이 악의적으로 변경되지 않도록 보호하는 보안 기법입니다. 주로 Return-Oriented Programming (ROP), **Jump-Oriented Programming (JOP)**와 같은 공격으로부터 시스템을 방어하는 데 사용됩니다. CFI는 실행 중인 프로그램의 제어 흐름이 예상된 정상적인 흐름을 따르고 있는지 확인하여, 공격자가 제어 흐름을 변경하는 시도를 탐지하고 차단합니다.CFI의 주요 개념:제어 흐름 그래프 (CFG, Control Flow Graph): CFI는 프로그램의 소스 코드에서 미리 제어 흐름 그래프(CFG)를 생성합니다. CFG는 프로그램의 모든 가능한 제어 흐름을 나타낸 그래프입니다. CFI는..

ROV

ROV(Return-Oriented Vulnerability)은 **Return-Oriented Programming (ROP)**과 밀접한 관계가 있습니다. **ROP(리턴 지향 프로그래밍)**는 메모리의 기존 코드 조각을 악용하여 임의의 동작을 수행하게 만드는 익스플로잇 기술로, 특히 DEP(Data Execution Prevention) 같은 방어 기법을 우회하는 데 사용됩니다.ROP(Return-Oriented Programming) 개념:기존 코드 조각 재사용: ROP는 공격자가 시스템 메모리에 있는 기존 코드 조각들을 재사용하여 악성 동작을 수행합니다. 이때 코드 조각은 작은 부분, 즉 **가젯(gadget)**이라고 부르는 기계어 명령의 모음입니다. 각 가젯은 RET(return) 명령으로 ..

ASLR

ASLR(Address Space Layout Randomization)은 시스템 보안을 강화하기 위한 기법 중 하나로, 프로세스가 메모리에 로드되는 주소를 무작위로 배치하여 공격자가 특정 메모리 주소를 예측하기 어렵게 만드는 기술입니다. 주로 메모리 기반 공격, 특히 버퍼 오버플로우 공격으로부터 시스템을 보호하는 데 사용됩니다.ASLR의 주요 개념:메모리 주소 무작위화: ASLR은 실행 중인 프로세스가 사용하는 메모리 공간(예: 실행 파일, 라이브러리, 스택, 힙 등)의 위치를 매번 무작위로 배치합니다. 이를 통해 공격자가 미리 특정 메모리 주소를 파악하고 악성 코드를 주입하는 것을 방지할 수 있습니다.재배치되는 요소:프로그램 코드: 실행 파일의 코드가 메모리 내에서 예측 불가능한 위치에 로드됩니다.동..

DEP

Windows DEP(Data Execution Prevention)는 시스템 메모리의 특정 영역에서 코드가 실행되지 않도록 방지하는 보안 기능입니다. DEP는 주로 메모리에서 발생할 수 있는 악성 코드의 실행을 차단하여 시스템의 보안성을 강화하는 역할을 합니다.DEP의 주요 개념:실행 방지 메모리 영역: DEP는 시스템 메모리의 일부를 "실행 불가"로 표시합니다. 즉, 그 메모리 영역에서는 데이터만 저장할 수 있으며, 코드를 실행할 수 없습니다. 이러한 메모리 보호는 주로 버퍼 오버플로우 공격과 같은 악성 코드 실행을 방지합니다.하드웨어 기반 DEP: 하드웨어 기반 DEP는 CPU의 기능을 사용하여 메모리 영역을 보호합니다. 하드웨어에서 제공하는 NX(Non-Executable) 비트 또는 XD(eXe..

임계영역 설정 종류 및 방법

임계영역 설정 방법 및 C++ 예제 1. 임계영역(Critical Section)이란? 임계영역(Critical Section)은 멀티스레드 프로그램에서 공유 자원에 대한 접근을 제어하기 위해 사용되는 코드 블록입니다. 여러 스레드가 동시에 임계영역에 접근하게 되면 데이터가 손상되거나 일관성이 깨질 수 있기 때문에, 한 번에 하나의 스레드만 임계영역에 접근할 수 있도록 동기화 메커니즘을 적용합니다. 2. 임계영역 보호 기법의 종류 뮤텍스(Mutex): 상호 배제를 통해 한 번에 하나의 스레드만 자원에 접근할 수 있게 합니다. 스핀락(Spinlock): 스레드가 잠금을 얻기 위해 계속 루프를 돌며 대기하는 방식입니다. 세마포어(Semaphore)..

Cross Compile 소스코드 파일 끝문자 형식(LF,CRLF)

문서 끝문자 형식 문제 해결: "LF" vs "CRLF"리눅스 및 유닉스 환경과의 호환성을 위해 소스 코드는 LF(Line Feed) 형식을 사용하여 관리해야 합니다.Git 설정 추가모든 파일의 끝문자 형식을 일관되게 관리하기 위해 다음과 같은 Git 설정을 추가합니다.git config --global core.autocrlf true이 설정의 동작 방식은 다음과 같습니다:체크아웃(Checkout):리포지토리에서 파일을 체크아웃할 때, 줄 끝 문자가 LF인 파일을 CRLF로 변환합니다. 이는 Windows 환경에서 작업할 때 편리합니다.커밋(Commit):파일을 커밋할 때, CRLF 줄 끝 문자가 포함된 파일을 LF로 변환하여 리포지토리에 저장합니다. 이는 리눅스 및 유닉스 환경과의 호환성을 보장합니다..

반응형