10P by neo 6일전 | ★ favorite | 댓글 1개

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일 제공됨
Hacker News 의견
  • 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의 일부임
  • 또 다른 훌륭한 자료로 <a href="https://why-openbsd.rocks/" rel="nofollow">https://why-openbsd.rocks/</a>를 추천함