Rust 1.98.0 릴리슀: μ§€λ‚œ 3κ°œμ›” λ™μ•ˆ 53만 번 λ‹€μš΄λ‘œλ“œλœ arrayref νŒ¨ν‚€μ§€μ˜ 취약점 발견

λͺ¨μ§ˆλΌ ν”„λ‘œμ νŠΈμ—μ„œ κ°œλ°œλ˜μ—ˆμ§€λ§Œ ν˜„μž¬λŠ” 독립 λΉ„μ˜λ¦¬ 단체인 Rust Foundation의 ν›„μ›μœΌλ‘œ 개발되고 μžˆλŠ” Rust 1.98 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ μΆœμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 μ–Έμ–΄λŠ” λ©”λͺ¨λ¦¬ μ•ˆμ „μ„±μ— 쀑점을 두고 있으며, κ°€λΉ„μ§€ 컬렉터와 λŸ°νƒ€μž„μ„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄μ„œλ„ 높은 병렬성을 κ΅¬ν˜„ν•  수 μžˆλŠ” 도ꡬλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€(λŸ°νƒ€μž„μ€ κΈ°λ³Έ μ΄ˆκΈ°ν™” 및 ν‘œμ€€ 라이브러리 μœ μ§€ κ΄€λ¦¬λ‘œ μΆ•μ†Œλ¨).

Rust의 λ©”λͺ¨λ¦¬ 관리 방식은 포인터 μ‘°μž‘ 였λ₯˜λ₯Ό λ°©μ§€ν•˜κ³ , ν•΄μ œλœ λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•˜κ±°λ‚˜, 널 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜κ±°λ‚˜, 버퍼 μ˜€λ²„λŸ°μ„ μΌμœΌν‚€λŠ” λ“± μ €μˆ˜μ€€ λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ—μ„œ λ°œμƒν•˜λŠ” 문제λ₯Ό μ˜ˆλ°©ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ³Έ ν”„λ‘œμ νŠΈλŠ” 라이브러리 배포, λΉŒλ“œ κ°„μ†Œν™” 및 쒅속성 관리λ₯Ό μœ„ν•΄ Cargo νŒ¨ν‚€μ§€ κ΄€λ¦¬μžλ₯Ό κ°œλ°œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 라이브러리 ν˜ΈμŠ€νŒ…μ„ μœ„ν•΄ crates.io μ €μž₯μ†Œλ₯Ό κ΄€λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ μ•ˆμ „μ€ 컴파일 μ‹œκ°„μ— μ°Έμ‘° 확인, 개체 μ†Œμœ κΆŒ 좔적, 개체 수λͺ…(λ²”μœ„) 좔적 및 μ½”λ“œ μ‹€ν–‰ 쀑 λ©”λͺ¨λ¦¬ μ•‘μ„ΈμŠ€μ˜ μ •ν™•μ„± 평가λ₯Ό 톡해 Rustμ—μ„œ μ œκ³΅λ©λ‹ˆλ‹€. RustλŠ” λ˜ν•œ μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμ— λŒ€ν•œ 보호 κΈ°λŠ₯을 μ œκ³΅ν•˜κ³ , μ‚¬μš©ν•˜κΈ° 전에 λ³€μˆ˜ κ°’μ˜ ν•„μˆ˜ μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•˜λ©°, ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 였λ₯˜λ₯Ό 더 잘 μ²˜λ¦¬ν•˜κ³ , 기본적으둜 λΆˆλ³€ μ°Έμ‘° 및 λ³€μˆ˜ κ°œλ…μ„ μ μš©ν•˜κ³ , κ°•λ ₯ν•œ 정적 μœ ν˜• 지정을 μ œκ³΅ν•˜μ—¬ 논리적 였λ₯˜λ₯Ό μ΅œμ†Œν™”ν•©λ‹ˆλ‹€.

μ£Όμš” ν˜μ‹ :

  • f32 및 f64 뢀동 μ†Œμˆ˜μ  νƒ€μž…μ˜ 경우, λ§μ…ˆ, λΊ„μ…ˆ, κ³±μ…ˆ, λ‚˜λˆ—μ…ˆ, λ‚˜λ¨Έμ§€ 연산에 λŒ€ν•œ λŒ€μˆ˜μ  방법이 κ΅¬ν˜„λ˜μ–΄ 있으며, C/C++ 컴파일러의 "-ffast-math" μ˜΅μ…˜κ³Ό μœ μ‚¬ν•œ μ΅œμ ν™”λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 방법을 톡해 루프 벑터화와 같은 μ΅œμ ν™”λ₯Ό μœ„ν•΄ ν•„μš”ν•œ 경우 μ—°μ‚° μˆœμ„œλ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 일반적인 λ§μ…ˆμœΌλ‘œ "a + b + c + d"λ₯Ό 계산할 λ•Œ μ»΄νŒŒμΌλŸ¬λŠ” 항상 "(a + b) + c) + d" μˆœμ„œλ‘œ 계산을 μˆ˜ν–‰ν•˜μ§€λ§Œ, algebraic_add 방법을 μ‚¬μš©ν•˜λ©΄ ν‘œν˜„μ‹μ„ "(a + b) + (c + d)"둜 λ¬Άμ–΄ SIMD λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ "(a + b)"와 "(c + d)"λ₯Ό λ³‘λ ¬λ‘œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€μˆ˜μ  방법을 μ‚¬μš©ν•˜λŠ” 단점은 계산 κ²°κ³Όκ°€ 비결정적이며 였차 λ²”μœ„ λ‚΄μ—μ„œ λ‹¬λΌμ§ˆ 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • λͺ¨λ“  κΈ°λ³Έ μ •μˆ˜ν˜•μ—λŠ” 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜λŠ” λ‚΄μž₯ "format_into" λ©”μ„œλ“œκ°€ 있으며, μ΄λŠ” itoa νŒ¨ν‚€μ§€ λŒ€μ‹  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜λ‘œ NumBuffer 버퍼가 μ „λ‹¬λ©λ‹ˆλ‹€. 이 λ²„νΌλŠ” μ‚¬μš©λœ νƒ€μž…μ˜ λͺ¨λ“  값을 μ‹­μ§„μˆ˜ ν˜•νƒœλ‘œ κΈ°λ‘ν•˜κΈ°μ— μΆ©λΆ„ν•œ 크기λ₯Ό 보μž₯ν•©λ‹ˆλ‹€. 좜λ ₯은 ν˜•μ‹ν™”λœ λ¬Έμžμ—΄ &str이며, ν•΄λ‹Ή λ¬Έμžμ—΄μ˜ 수λͺ…은 버퍼에 ν•œμ •λ©λ‹ˆλ‹€.
  • ManuallyDrop ν•˜λ„€μŠ€μ™€ Box 슀마트 포인터 κ°„μ˜ μƒν˜Έ μž‘μš©μœΌλ‘œ 인해 더 이상 μ •μ˜λ˜μ§€ μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • API의 μƒˆλ‘œμš΄ 뢀뢄이 μ•ˆμ •ν™”λœ νŠΉμ„±μ˜ λ©”μ„œλ“œ 및 κ΅¬ν˜„μ„ ν¬ν•¨ν•˜μ—¬ μ•ˆμ •μ μΈ λ²”μ£Όλ‘œ μ΄λ™λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • str::substr_range
    • [T]::ν•˜μœ„ 슬라이슀 λ²”μœ„
    • core::fmt::NumBuffer
    • <{integer}>::format_into
    • std::process::CommandArgs에 λŒ€ν•œ 전솑/동기화
    • {fN}::λŒ€μˆ˜μ  μΆ”κ°€
    • {fN}::λŒ€μˆ˜μ _ν•˜μœ„
    • {fN}::λŒ€μˆ˜μ _λ©€ν‹°ν”Œ
    • {fN}::λŒ€μˆ˜μ _div
    • {fN}::λŒ€μˆ˜μ _렘
    • NonZero<{integer}>::from_str_radix
    • λ¬Έμžμ—΄::from_utf16le
    • λ¬Έμžμ—΄::from_utf16le_lossy
    • λ¬Έμžμ—΄::from_utf16be
    • λ¬Έμžμ—΄::from_utf16be_lossy
    • [T]::strip_circumfix
    • str::strip_circumfix
    • μ›μž ::from_mut
    • μ›μž ::get_mut_slice
    • μ›μž ::from_mut_slice
    • std::range::legacy
  • thumbv7a-none-eabi, thumbv7a-none-eabihf, thumbv7r-none-eabi, thumbv7r-none-eabihf 및 thumbv8r-none-eabihf λŒ€μƒ ν”Œλž«νΌμ€ λΉŒλ“œ 보μž₯은 μ œκ³΅ν•˜μ§€λ§Œ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈ ν†΅κ³ΌλŠ” 보μž₯ν•˜μ§€ μ•ŠλŠ” 2단계 μ§€μ›μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • powerpc64-unknown-linux-gnuelfv2 및 aarch64-unknown-linux-pauthtest ν”Œλž«νΌμ— λŒ€ν•œ 지원이 μΆ”κ°€λ˜μ—ˆμœΌλ©°, 이제 레벨 3 지원을 μ œκ³΅ν•©λ‹ˆλ‹€. 레벨 3μ—λŠ” κΈ°λ³Έ 지원이 ν¬ν•¨λ˜μ§€λ§Œ μžλ™ν™”λœ ν…ŒμŠ€νŠΈ, 곡식 λΉŒλ“œ 릴리슀 λ˜λŠ” λΉŒλ“œ 검증은 ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, μ§€λ‚œ 90일 λ™μ•ˆ 5,300만 회 이상 λ‹€μš΄λ‘œλ“œλ˜μ—ˆκ³  403개의 νŒ¨ν‚€μ§€μ—μ„œ μ’…μ†μ„±μœΌλ‘œ μ‚¬μš©λ˜λŠ” 인기 크레이트 νŒ¨ν‚€μ§€μΈ arrayrefκ°€ κ³΅κ²©λ°›μ•˜μŠ΅λ‹ˆλ‹€. κ³΅κ²©μžλ“€μ€ μ•…μ„± μ½”λ“œκ°€ ν¬ν•¨λœ μƒˆλ‘œμš΄ νŒ¨ν‚€μ§€(proc-macro1, proc-macro-en, aovine, arone, aronenao, tinymember)λ₯Ό crates.io μ €μž₯μ†Œμ— κ²Œμ‹œν–ˆμŠ΅λ‹ˆλ‹€. 이후 arrayref 0.3.10, internment 0.8.7, append-only-vec 0.1.9의 μƒˆλ‘œμš΄ λ¦΄λ¦¬μŠ€κ°€ μ €μž₯μ†Œμ— κ²Œμ‹œλ˜μ—ˆμœΌλ©°, 각 λ¦΄λ¦¬μŠ€μ—λŠ” μ•…μ„± proc-macro1 νŒ¨ν‚€μ§€κ°€ μ’…μ†μ„±μœΌλ‘œ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ•…μ„± λ²„μ „μ˜ arrayref νŒ¨ν‚€μ§€λŠ” 8μ›” 20일 μ˜€μ „ 10μ‹œ 15λΆ„(MSK)에 κ²Œμ‹œλ˜μ–΄ μ˜€μ „ 11μ‹œ 41λΆ„κΉŒμ§€ ν™œμ„±ν™”λ˜μ–΄ μžˆλ‹€κ°€ crates.io κ΄€λ¦¬μžμ— μ˜ν•΄ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

arrayref νŒ¨ν‚€μ§€ κ΄€λ¦¬μžμ—κ²Œ 아직 연락이 λ‹Ώμ§€ μ•Šμ•„ 상황을 λͺ…ν™•νžˆ νŒŒμ•…ν•˜μ§€ λͺ»ν–ˆμ§€λ§Œ, κ΄€λ¦¬μžμ˜ 자격 증λͺ…이 κ³΅κ²©μžμ—κ²Œ νƒˆμ·¨λœ κ²ƒμœΌλ‘œ μΆ”μ •λ©λ‹ˆλ‹€. proc-macro1 νŒ¨ν‚€μ§€μ˜ λΉŒλ“œ μŠ€ν¬λ¦½νŠΈμ—μ„œ μ•…μ˜μ μΈ λ³€κ²½ 사항이 λ°œκ²¬λ˜μ—ˆμœΌλ©°, 이 λ³€κ²½ 사항은 μ™ΈλΆ€ λ””λ ‰ν„°λ¦¬μ˜ μ‹€ν–‰ νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” 역할을 ν–ˆμŠ΅λ‹ˆλ‹€. μ„œλ²„λ‹€μš΄λ‘œλ“œν•œ νŒŒμΌμ€ μœ λ‹‰μŠ€ μ‹œμŠ€ν…œμ—μ„œλŠ” /tmp/rust-setup에 μ €μž₯되고, Windows β€” %TEMP%\rust-setup.ps1 λ˜λŠ” %TEMP%\rust-setup-launch.vbs.

좜처 : opennet.ru

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