# OpenBSD의 혁신들

> Clean Markdown view of GeekNews topic #19383. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=19383](https://news.hada.io/topic?id=19383)
- GeekNews Markdown: [https://news.hada.io/topic/19383.md](https://news.hada.io/topic/19383.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-02-23T23:34:17+09:00
- Updated: 2025-02-23T23:34:17+09:00
- Original source: [openbsd.org](https://www.openbsd.org/innovations.html)
- Points: 10
- Comments: 1

## Summary

OpenBSD 프로젝트는 다양한 보안 및 기능 개선을 통해 운영체제의 안정성과 보안을 강화해 왔습니다. 주요 혁신으로는 IPSec, IPv6 통합, 권한 분리 및 반납, 스택 보호기, W^X, ASLR, malloc 보안 강화, 위치 독립 실행 파일(PIE) 등이 있으며, 이러한 기능들은 OpenBSD의 여러 버전에서 점진적으로 도입되었습니다. 또한, OpenBSD는 OpenSSH, OpenSMTPD, LibreSSL 등과 같은 다양한 프로그램과 서브시스템을 개발하여 보안성과 효율성을 높이는 데 기여하고 있습니다.

## Topic Body

OpenBSD 프로젝트는 다양한 소프트웨어와 아이디어를 개발 및 유지 관리하고 있음. 대략적인 도입순서에 따른 정리  
### 개념 (Concepts)  
- **IPSec(4)**: OpenBSD는 IPSec 스택을 제공한 최초의 Free 운영체제였음. 1997년 2월 20일 도입  
- **INET6(4)**: OpenBSD 2.7에서 IPv6 완전 통합. 1999년 1월 6일부터 개발 시작, 같은 해 6월 6일 첫 해커톤에서 거의 완전한 작동 상태 도달  
- **권한 분리 (Privilege Separation)**: 2002년 3월, OpenSSH에서 처음 구현됨. 이후 bgpd(8), dhclient(8), smtpd(8), tmux(1) 등 다양한 프로그램에 적용  
- **권한 반납 (Privilege Revocation)**: 특정 리소스를 유지하면서도 권한을 낮추는 방식 적용. 예: ping(8), traceroute(8)  
- **스택 보호기 (Stack Protector)**: 2001년부터 개발된 "propolice" 기반. OpenBSD 3.3에서 기본 활성화  
- **W^X (Write XOR Execute)**: OpenBSD 3.3에서 처음 적용. OpenBSD 6.0부터 기본적으로 엄격하게 강제됨  
- **GOT 및 PLT 보호**: OpenBSD 3.3에서 GOT(전역 오프셋 테이블) 및 PLT(프로시저 링크 테이블)를 보호하도록 ld.so가 개선됨  
- **ASLR (Address Space Layout Randomization)**: OpenBSD 3.4가 처음으로 기본 활성화  
- **gcc-local(1) 분석 및 검사**: OpenBSD 3.4에서 처음 도입  
- **malloc(3) 보안 강화**: 메모리 할당 시 난수화 및 지연 해제 적용. OpenBSD 4.4에서 재구현  
- **위치 독립 실행 파일 (PIE)**: OpenBSD 5.3에서 처음으로 기본 활성화. 7개 하드웨어 플랫폼   
- **난수 기반 메모리 초기화**: OpenBSD 5.3에서 ELF .openbsd.randomdata 섹션 추가  
- **공유 객체별 스택 보호기**: OpenBSD 5.3에서 각 공유 객체에 개별적인 스택 보호기 쿠키 적용  
- **Static-PIE**: /bin, /sbin 및 RAM 디스크에서 위치 독립적 정적 바이너리 지원. OpenBSD 5.7에서 도입  
- **SROP 공격 완화**: OpenBSD 6.0에서 기본 활성화  
- **라이브러리 로드 순서 난수화**: OpenBSD 6.0 및 6.2에서 기본 활성화  
- **멀티스레드 환경에서 W^X 안전성을 위한 lazy-binding 개선**: OpenBSD 5.9에서 도입  
- **메모리 레이아웃 강화**: OpenBSD 6.1에서 모든 프로그램과 라이브러리에 적용  
- **fork+exec 방식 사용**: 권한 분리된 프로그램에서 주소 공간 보호 강화  
- **trapsleds**: ROP(반환 지향 프로그래밍) 공격 완화 목적의 NOP 변환 기법 적용  
- **커널 부팅 시 재링크**: 매 부팅마다 커널 내부 레이아웃을 무작위화  
- **i386/amd64 명령어 시퀀스 보안 강화**: ROP 공격을 어렵게 하기 위한 개선  
- **MAP_STACK 옵션 추가**: ROP 공격에서 스택 이외의 메모리를 악용하는 것을 방지  
- **RETGUARD**: 기존 스택 보호기보다 강력한 보호 메커니즘으로 OpenBSD 6.4부터 도입  
- **MAP_CONCEAL 옵션 추가**: 민감한 정보가 코어 덤프에서 유출되지 않도록 방지  
- **PROT_WRITE 메모리에서 시스템 호출 차단**: OpenBSD 6.5에서 도입  
- **시스템 호출 위치 고정**: 특정 위치에서만 시스템 호출이 가능하도록 제한  
- **주소 공간 보호 강화**: mmap(2), mprotect(2) 등을 통한 메모리 변경을 제한  
- **sshd 부팅 시 재링크**: OpenBSD 7.2에서 도입  
- **비독성 코드(xonly) 지원**: 실행 가능한 메모리를 읽을 수 없도록 제한  
- **pinsyscalls(2) 시스템 호출 보호**: 시스템 호출 위치를 사전에 등록하여 보호  
- **간접 분기 타겟 보호(BTI, IBT)**: 하드웨어 기반 보안 기능 적용  
- **-fret-clean 기능 추가**: 반환값이 스택에 남아있는 것을 방지하여 정보 유출 차단. 현재 amd64에서만 적용  
  
### 함수 (Functions)  
  
- **issetugid(2)**: OpenBSD 2.0에서 도입된 함수로, 프로세스가 실행 중 설정된 사용자 ID 또는 그룹 ID를 확인하는 기능 제공  
- **arc4random(3)**: 난수 생성 함수로, OpenBSD 2.1에서 추가됨  
- **bcrypt(3)**: 패스워드 해싱을 위한 함수. OpenBSD 2.1에서 처음 도입  
- **strlcpy(3), strlcat(3)**: 안전한 문자열 복사 및 연결을 위한 함수. OpenBSD 2.4에서 도입  
- **strtonum(3)**: 문자열을 숫자로 변환하면서 오류를 방지하는 함수. OpenBSD 3.6에서 도입  
- **imsg**: 메시지 전달 API로, 다양한 데몬에서 사용됨. OpenBSD 4.8에서 libutil에 추가  
- **timingsafe_bcmp(3)**: 일정한 실행 시간을 보장하는 바이트 비교 함수. OpenBSD 4.9에서 도입  
- **explicit_bzero(3)**: 메모리를 안전하게 삭제하는 함수. OpenBSD 5.5에서 추가  
- **ohash**: 해시 테이블 구현. OpenBSD 5.6에서 libutil에 포함  
- **asr**: 대체 DNS 해석기. OpenBSD 5.6에서 활성화됨  
- **reallocarray(3)**: 메모리 재할당 시 오버플로우를 방지하는 함수. OpenBSD 5.6에서 추가  
- **getentropy(2)**: 보안적으로 안전한 난수를 제공하는 함수. OpenBSD 5.6에서 도입  
- **sendsyslog(2)**: 커널에서 syslog 메시지를 보내는 함수. OpenBSD 5.6에서 추가  
- **timingsafe_memcmp(3)**: 일정한 실행 시간을 보장하는 메모리 비교 함수. OpenBSD 5.6에서 도입  
- **pledge(2)**: 시스템 콜을 제한하여 보안성을 높이는 함수. OpenBSD 5.9에서 추가  
- **getpwnam_shadow(3), getpwuid_shadow(3)**: 보안 강화를 위해 그림자 암호 데이터를 검색하는 함수. OpenBSD 5.9에서 도입  
- **recallocarray(3)**: 메모리 크기 조정 시 기존 데이터를 0으로 채우는 함수. OpenBSD 6.1에서 추가  
- **freezero(3)**: 메모리를 해제하면서 0으로 채우는 함수. OpenBSD 6.2에서 도입  
- **unveil(2)**: 파일 시스템 접근을 제한하는 함수. OpenBSD 6.4에서 추가  
- **malloc_conceal(3), calloc_conceal(3)**: 메모리 할당 시 민감한 데이터를 보호하는 기능 제공. OpenBSD 6.5에서 추가  
- **ober**: ASN.1 기본 인코딩 규칙 API. OpenBSD 6.6에서 libutil로 이동  
  
### 프로그램 및 서브시스템 (Programs and Subsystems)  
  
- **YP 관련 유틸리티**: ypbind(8), ypset(8), ypcat(1), ypmatch(1), ypwhich(1), libc 지원 추가. NetBSD 0.9에서 처음 배포됨  
- **ypserv(8)**: OpenBSD 2.0에서 도입된 YP 서버  
- **mopd(8)**: MOP(Maintenance Operations Protocol) 지원 데몬. OpenBSD 2.0에서 추가  
- **AnonCVS**: OpenBSD 코드 저장소를 익명으로 접근할 수 있도록 설계된 시스템  
- **aucat(1)**: 오디오 서버와 관련된 유틸리티. OpenBSD 2.1에서 추가됨  
- **OpenSSH**: SSH 기반 보안 통신 도구. OpenBSD 2.6에서 도입됨  
- **mg(1)**: 가벼운 텍스트 편집기. OpenBSD 2.7에서 포함됨  
- **m4(1)**: 매크로 프로세서. OpenBSD 2.7 이후 확장 및 유지보수됨  
- **pf(4), pfctl(8), pflogd(8), authpf(8), ftp-proxy(8)**: 패킷 필터링 방화벽. OpenBSD 3.0에서 추가됨  
- **systrace(4), systrace(1)**: 시스템 호출 모니터링 도구. OpenBSD 3.2에서 추가되었지만, OpenBSD 5.9 이후 pledge(2)로 대체됨  
- **spamd(8)**: 스팸 필터링을 위한 데몬. OpenBSD 3.3에서 도입됨  
- **dc(1), bc(1)**: 계산기 유틸리티. OpenBSD 3.5에서 추가됨  
- **sensorsd(8)**: 하드웨어 센서 모니터링 도구. OpenBSD 3.5에서 포함됨  
- **pkg_add(1)**: 패키지 관리 유틸리티. OpenBSD 3.5에서 도입됨  
- **carp(4)**: 장애 조치를 위한 네트워크 인터페이스 프로토콜. OpenBSD 3.5에서 추가됨  
- **OpenBGPD**: BGP 라우팅 데몬. OpenBSD 3.5에서 도입됨  
- **dhclient(8), dhcpd(8)**: DHCP 클라이언트 및 서버. OpenBSD 3.5~3.6에서 추가됨  
- **hotplugd(8)**: 핫플러그 이벤트 처리 데몬. OpenBSD 3.6에서 추가됨  
- **OpenNTPD**: NTP(Network Time Protocol) 데몬. OpenBSD 3.6에서 추가됨  
- **dpb(1)**: 분산 패키지 빌드 시스템. OpenBSD 3.6에서 도입됨  
- **ospfd(8), ospfctl(8), ospf6d(8)**: OSPF(Open Shortest Path First) 라우팅 데몬. OpenBSD 3.7~4.2에서 도입됨  
- **ifstated(8)**: 인터페이스 상태 관리 도구. OpenBSD 3.8에서 추가됨  
- **bioctl(8)**: 블록 장치 및 RAID 관리 도구. OpenBSD 3.8에서 포함됨  
- **hostapd(8)**: 무선 액세스 포인트 관리 도구. OpenBSD 3.8에서 도입됨  
- **watchdogd(8)**: 시스템 안정성을 보장하는 감시 타이머. OpenBSD 3.8에서 추가됨  
- **sdiff(1)**: 파일 비교 유틸리티. OpenBSD 3.9에서 도입됨  
- **dvmrpd(8), dvmrpctl(8)**: DVMRP(Distance Vector Multicast Routing Protocol) 지원. OpenBSD 4.0에서 추가됨  
- **ripd(8), ripctl(8)**: RIP(Routing Information Protocol) 지원. OpenBSD 4.1에서 포함됨  
- **pkg-config(1)**: 패키지 구성 도구. OpenBSD 4.1에서 도입됨  
- **relayd(8), relayctl(8)**: 네트워크 트래픽 리레이 도구. OpenBSD 4.1에서 추가됨  
- **cwm(1)**: 경량 윈도우 매니저. OpenBSD 4.2에서 추가됨  
- **libtool(1)**: 라이브러리 구축 자동화 도구. OpenBSD 4.3에서 포함됨  
- **snmpd(8)**: SNMP(Simple Network Management Protocol) 데몬. OpenBSD 4.3에서 추가됨  
- **sysmerge(8)**: 시스템 구성 파일 병합 도구. OpenBSD 4.4에서 추가됨  
- **ypldap(8)**: LDAP 기반 YP 서버. OpenBSD 4.4에서 포함됨  
- **OpenSMTPD**: SMTP(Simple Mail Transfer Protocol) 서버. OpenBSD 4.6에서 도입됨  
- **tmux(1)**: 터미널 멀티플렉서. OpenBSD 4.6에서 포함됨  
- **ldpd(8), ldpctl(8)**: 라벨 배포 프로토콜(LDP) 지원. OpenBSD 4.6에서 추가됨  
- **mandoc(1)**: 매뉴얼 페이지 문서화 도구. OpenBSD 4.8에서 도입됨  
- **ldapd(8), ldapctl(8)**: 경량 디렉터리 액세스 프로토콜(LDAP) 서버. OpenBSD 4.8에서 추가됨  
- **OpenIKED**: IKE(Internet Key Exchange) 프로토콜 구현. OpenBSD 4.8에서 도입됨  
- **iscsid(8), iscsictl(8)**: iSCSI 데몬. OpenBSD 4.9에서 포함됨  
- **rc.d(8), rc.subr(8)**: 시스템 초기화 스크립트 관리. OpenBSD 4.9에서 추가됨  
- **npppd(8), npppctl(8)**: PPP(Point-to-Point Protocol) 데몬. OpenBSD 5.3에서 추가됨  
- **ldomd(8), ldomctl(8)**: LDOM(Logical Domains) 관리 도구. OpenBSD 5.3에서 포함됨  
- **sndiod(8)**: 오디오 서버. OpenBSD 5.3에서 도입됨  
- **cu(1)**: 직렬 통신 유틸리티. OpenBSD 5.4에서 추가됨  
- **slowcgi(8)**: 느린 HTTP 요청을 처리하는 도구. OpenBSD 5.4에서 포함됨  
- **signify(1)**: 파일 서명 및 검증 도구. OpenBSD 5.5에서 추가됨  
- **LibreSSL**: OpenSSL을 포크하여 보안성을 강화한 프로젝트. OpenBSD 5.6에서 처음 출시됨  
- **httpd(8)**: 경량 웹 서버. OpenBSD 5.6에서 포함됨  
- **rcctl(8)**: rc.d 서비스 관리 유틸리티. OpenBSD 5.7에서 추가됨  
- **doas(1)**: 간단한 권한 상승 유틸리티. OpenBSD 5.8에서 도입됨  
- **radiusd(8)**: RADIUS 서버 구현. OpenBSD 5.8에서 추가됨  
- **eigrpd(8), eigrpctl(8)**: EIGRP(Enhanced Interior Gateway Routing Protocol) 지원. OpenBSD 5.9에서 포함됨  
- **vmm(4), vmd(8), vmctl(8)**: 가상 머신 관리 시스템. OpenBSD 5.9에서 추가됨  
- **acme-client(1)**: ACME 프로토콜을 사용한 인증서 발급 클라이언트. OpenBSD 6.1에서 도입됨  
- **syspatch(8)**: 보안 패치 관리 도구. OpenBSD 6.1에서 추가됨  
- **xenodm(1)**: XDM의 정리된 포크 버전. OpenBSD 6.1에서 포함됨  
- **unwind(8)**: 로컬 DNS 리졸버. OpenBSD 6.5에서 도입됨  
- **sysupgrade(8)**: 시스템 자동 업그레이드 도구. OpenBSD 6.6에서 추가됨  
- **rpki-client(8)**: RPKI(Route Origin Validation) 클라이언트. OpenBSD 6.7에서 도입됨  
- **resolvd(8)**: 동적 네트워크 환경에서 DNS 설정을 관리하는 도구. OpenBSD 6.9에서 추가됨  
- **dhcpleased(8)**: 향상된 DHCP 클라이언트. OpenBSD 6.9에서 포함됨  
  
### OpenBSD 개발자가 OpenBSD 외부에서 유지보수하는 프로젝트  
- **sudo**: 시스템 관리자가 특정 사용자에게 제한된 명령 실행 권한을 부여할 수 있도록 하는 도구. OpenBSD 2.7에서 포함됨  
- **femail**: 간단한 메일 전송 도구. 2005년 시작되었으며, OpenBSD 포트는 같은 해 9월 22일 제공됨  
- **midish**: MIDI 시퀀서 및 처리 도구. 2003년 시작되었으며, OpenBSD 포트는 2005년 11월 4일 제공됨  
- **fdm**: 메일 필터링 및 정리 도구. 2006년 시작되었으며, OpenBSD 포트는 2007년 1월 18일 제공됨  
- **toad**: OpenBSD용 소프트웨어 자동 배포 도구. 2013년 시작되었으며, OpenBSD 포트는 같은 해 10월 8일 제공됨  
- **docbook2mdoc**: DocBook 문서를 mdoc 매뉴얼 페이지 형식으로 변환하는 도구. 2014년 시작되었으며, OpenBSD 포트는 같은 해 4월 3일 제공됨  
- **portroach**: FreeBSD의 portscout을 포크하여 개발된 포트 업데이트 추적 도구. 2014년 시작되었으며, OpenBSD 포트는 같은 해 9월 5일 제공됨  
- **cvs2gitdump**: CVS 저장소를 Git으로 변환하는 도구. 2012년 시작되었으며, OpenBSD 포트는 2016년 8월 1일 제공됨  
- **Game of Trees**: Git을 대체할 수 있는 버전 관리 시스템. 2017년 시작되었으며, OpenBSD 포트는 2019년 8월 9일 제공됨

## Comments



### Comment 35000

- Author: neo
- Created: 2025-02-23T23:34:18+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=43143777) 
* OpenBSD 재단은 약 38만 달러를 모금했음
  - OpenSSH를 만들었고 Fortune 500 기업들이 모두 사용하고 있는 점을 고려할 때, 매년 1~2백만 달러를 모금해야 한다고 생각함
  - 이러한 기업들이 이제는 기여를 해야 할 때임
  - 하드웨어 벤더들도 소스를 공개해야 하며, Nvidia를 직접적으로 언급함

* John Ioannidis가 몇 주 전에 세상을 떠났으며, 거의 아무도 이를 알아차리지 못했음
  - 그는 Mobile IP(휴대폰에서의 IP 작동을 가능하게 한) 기반을 만든 사람으로도 알려져 있음

* OpenBSD의 privdrop/privsep 디자인과 pledge(2)/unveil(2)의 채택 외에도, 최근의 mimmutable 같은 완화 작업이 주목받지 못하고 있음
  - OpenBSD에서 대부분의 프로그램의 정적 주소 공간이 자동으로 불변하게 되었음
  - 현대의 Intel/AMD, ARM 기계에서 기본적으로 실행 전용 메모리와 BTI/IBT가 활성화되어 있음
  - 더 큰 소프트웨어 생태계를 준비시키기 위한 포트 개발 작업도 포함됨

* OpenBSD 5.3에서 Matthew Dempsky에 의해 무작위 데이터 메모리가 구현되었음
  - 이 기능의 사용 사례로는 RETGUARD가 있음
  - RETGUARD는 스택 보호자를 대체하며, 함수별 무작위 쿠키를 사용하여 스택의 반환 주소를 일관성 있게 확인함

* AmigaOS는 1985년에 위치 독립 실행 파일(PIE)과 ASLR을 사용했음
  - Amiga는 MMU가 없고 메모리가 적었기 때문에, 로드된 모든 것이 사용 가능한 램에 배치되어야 했음
  - 개별 섹션이 다른 위치에 배치될 수 있었으며, 컴파일러는 이를 위해 많은 섹션을 생성했음

* pledge/unveil이 더 두드러지게 소개되지 않은 것에 놀라움을 표함

* OpenBSD가 ISO C11 _Thread_local을 구현했는지 궁금해함
  - 이는 OpenBSD로 소프트웨어를 포팅하는 데 가장 큰 불편함이었음
  - OpenBSD는 네이티브 스레드 로컬 저장소를 지원하지 않는 유일한 주요 OS였음

* OpenBSD 페이지가 기본 HTML만 사용하고 스타일링이나 CSS를 사용하지 않는 이유에 대해 의문을 제기함
  - 타이포그래피는 가독성에 중요하며, 최소한 적절한 줄 높이와 60자 정도의 줄 길이를 제한해야 함
  - OpenBSD가 잠재적 사용자를 진지하게 고려하지 않는 것인지 의문을 가짐
  - 사용자 경험이 중요하며, 문서의 가독성도 UX의 일부임

* 또 다른 훌륭한 자료로 &lt;a href="https://why-openbsd.rocks/" rel="nofollow"&gt;https://why-openbsd.rocks/&lt;/a&gt;를 추천함
