LLVM ν”„λ‘œμ νŠΈλŠ” C++μ—μ„œ 버퍼 μ•ˆμ „ 처리λ₯Ό κ°œλ°œν•©λ‹ˆλ‹€.

LLVM ν”„λ‘œμ νŠΈ κ°œλ°œμžλŠ” 업무상 μ€‘μš”ν•œ C++ ν”„λ‘œμ νŠΈμ˜ λ³΄μ•ˆμ„ κ°•ν™”ν•˜κ³  버퍼 μ˜€λ²„λŸ°μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” 였λ₯˜λ₯Ό μ œκ±°ν•˜λŠ” μˆ˜λ‹¨μ„ μ œκ³΅ν•˜κΈ° μœ„ν•œ μ—¬λŸ¬ κ°€μ§€ λ³€κ²½ 사항을 μ œμ•ˆν–ˆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ€ 두 κ°€μ§€ μ˜μ—­μ— 쀑점을 두고 μžˆμŠ΅λ‹ˆλ‹€. 즉, 버퍼λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•ˆμ „ν•œ μž‘μ—…μ„ ν—ˆμš©ν•˜λŠ” 개발 λͺ¨λΈμ„ μ œκ³΅ν•˜λŠ” 것과 libc++ ν‘œμ€€ ν•¨μˆ˜ 라이브러리의 λ³΄μ•ˆμ„ κ°•ν™”ν•˜λŠ” μž‘μ—…μž…λ‹ˆλ‹€.

μ œμ•ˆλœ C++용 μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž˜λ° λͺ¨λΈμ—λŠ” λ² μ–΄ 포인터λ₯Ό μ‘°μž‘ν•˜λŠ” λŒ€μ‹  λ²„νΌλ‘œ μž‘μ—…ν•  λ•Œ ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 ν¬ν•¨λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κ³Όλ‹€ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬μ— λŒ€ν•œ λŸ°νƒ€μž„ 검사λ₯Ό μΆ”κ°€ν•˜λŠ” std::array, std::Vector 및 std::span 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ œμ•ˆλ©λ‹ˆλ‹€.

clang의 μœ„ν—˜ν•œ ν”„λ‘œκ·Έλž˜λ° 관행을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ "cppcoreguidelines-pro-bounds-pointer-arithmetic" ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•  λ•Œ clang-tidy linter κ²½κ³  좜λ ₯κ³Ό μœ μ‚¬ν•˜κ²Œ λͺ¨λ“  포인터 μ—°μ‚° μž‘μ—…μ— λŒ€ν•œ 컴파일러 κ²½κ³ λ₯Ό ν‘œμ‹œν•˜λŠ” 것이 μ œμ•ˆλ©λ‹ˆλ‹€. LLVM 16 λ¦΄λ¦¬μŠ€μ— λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ²½κ³ λ₯Ό ν™œμ„±ν™”ν•˜κΈ° μœ„ν•΄ 기본적으둜 ν™œμ„±ν™”λ˜μ§€ μ•Šμ€ λ³„λ„μ˜ ν”Œλž˜κ·Έκ°€ clang에 μΆ”κ°€λ©λ‹ˆλ‹€.

libc++μ—μ„œλŠ” 선택적 κ°•ν™” 보호 λͺ¨λ“œλ₯Ό κ΅¬ν˜„ν•  κ³„νšμž…λ‹ˆλ‹€. 이 λͺ¨λ“œλ₯Ό ν™œμ„±ν™”ν•˜λ©΄ μ •μ˜λ˜μ§€ μ•Šμ€ λ™μž‘μœΌλ‘œ μ΄μ–΄μ§€λŠ” 일뢀 상황을 λŸ°νƒ€μž„μ— 포착할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, std::span 및 std::Vector ν΄λž˜μŠ€μ—μ„œλŠ” λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ λ©”λͺ¨λ¦¬ μ•‘μ„ΈμŠ€κ°€ λͺ¨λ‹ˆν„°λ§λ˜λ©°, κ°μ§€λ˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ€‘λ‹¨λ©λ‹ˆλ‹€. κ°œλ°œμžλ“€μ€ μ΄λŸ¬ν•œ λ³€κ²½ 사항을 μΆ”κ°€ν•˜λ©΄ libc++κ°€ C++ ν‘œμ€€μ„ μ€€μˆ˜ν•  것이라고 λ―ΏμŠ΅λ‹ˆλ‹€. μ •μ˜λ˜μ§€ μ•Šμ€ λ™μž‘μ„ μ²˜λ¦¬ν•˜λŠ” 방법에 λŒ€ν•œ 선택은 무엇보닀도 μ •μ˜λ˜μ§€ μ•Šμ€ λ™μž‘μ„ μ‹€νŒ¨λ‘œ μ²˜λ¦¬ν•˜μ—¬ λ‹€μŒ μž‘μ—…μ„ μš”κ΅¬ν•  수 μžˆλŠ” 라이브러리 κ°œλ°œμžμ—κ²Œ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.

libc++의 λŸ°νƒ€μž„ κ²€μ‚¬λŠ” κ°œλ³„μ μœΌλ‘œ ν™œμ„±ν™”ν•  수 μžˆλŠ” λ²”μ£Όλ‘œ λ‚˜λˆ„μ–΄μ§ˆ κ³„νšμž…λ‹ˆλ‹€. μž‘μ—…μ΄ λ³΅μž‘ν•΄μ§€κ±°λ‚˜ ABIκ°€ λ³€κ²½λ˜μ§€ μ•ŠλŠ” μ œμ•ˆλœ 검사 쀑 μΌλΆ€λŠ” 이미 libc++ μ•ˆμ „ λͺ¨λ“œ λ‚΄μ—μ„œ κ΅¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μΆ”κ°€μ μœΌλ‘œ, μ½”λ“œ μ—…λ°μ΄νŠΈλ₯Ό μœ„ν•œ 도ꡬλ₯Ό μ€€λΉ„ν•  κ³„νšμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ³€μˆ˜λ₯Ό λ² μ–΄ ν¬μΈν„°λ‘œ λŒ€μ²΄ν•˜κ³  μ»¨ν…Œμ΄λ„ˆκ°€ 포인터λ₯Ό 직접 λŒ€μ²΄ν•  수 μ—†λŠ” μƒν™©μ—μ„œ λŒ€μ²΄ ν•Έλ“€λŸ¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€(예: "if(array_pointer)" ꡬ성은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€). if(span.data) ()")둜 λ³€ν™˜λ©λ‹ˆλ‹€. 쑰정은 둜컬 λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ 포인터 μœ ν˜•μ˜ λ§€κ°œλ³€μˆ˜μ—λ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

좜처 : opennet.ru

DDoS 보호, VPS VDS μ„œλ²„κ°€ μžˆλŠ” μ‚¬μ΄νŠΈλ₯Ό μœ„ν•œ μ•ˆμ •μ μΈ ν˜ΈμŠ€νŒ… κ΅¬μž… πŸ”₯ DDoS 곡격 λ°©μ§€ κΈ°λŠ₯이 νƒ‘μž¬λœ μ•ˆμ •μ μΈ μ›Ήμ‚¬μ΄νŠΈ ν˜ΈμŠ€νŒ…, VPS 및 VDS μ„œλ²„λ₯Ό κ΅¬λ§€ν•˜μ„Έμš” | ProHoster