아파치 HTTPd Devs Considered Harmful

[초안] 최종 업데이트 제작: Joe Schaefer 수, 13 5월 2026    소스
 

타르와 깃털

배경

지난 25 년 동안, 나는의 리드 개발자였습니다 apreq 하위 프로젝트 아파치 HTTPd 서버 상위 프로젝트. 원래 아이디어 libapreq안전/수행자로 HTML 폼 제출쿠키 parsing library는 90s 후반에 Lincoln Stein과 Doug MacEachern 간의 공동 작업에서 나왔습니다.

그때부터 도서관을 일반적이고 Perl이 아닌 관련 도서관으로 바꾸는 것은 나의 비전이었습니다. C 다른 프로그래밍 언어의 언어 바인딩을 지원하는 라이브러리, 그래서 나는 프로젝트를 밀어 HTTPd 우산 대신 아파치펄 프로젝트

[중고] [중고]의 출현 httpd-2.X완전히 새로운 I/O Filter 아키텍처는 httpd 핵심 및 전체 분리 APR 보다 일반적인 용도의 POSIX와 유사한 이식성 런타임으로 코어 자체에서 C 프로젝트 유사 Subversion. 사실, libapreq2 보다 긴밀하게 조율된 Apache APR 그 정신에 있는 프로젝트 및 그것의 Perl API는 그것의 한 부분으로 그것을 반영합니다 APR::Request 빌드아웃. 독립형 작업을 위한 CGI 모드가 내장되어 있습니다. httpd runtime(런타임) - 장치 테스트가 번거로워집니다.

핵심 구성 요소 apreq2 은 항상 mod_apreq2 아파치 모듈(Apache module)은 Bill Wrowe 초기 2000s. 그가 설계 한 것은 (대면) 나와 브레인 스토밍 세션 중에 내부의 단일 파서 라이브러리였습니다. httpd즉, 제출된 요청 body를 런타임에 모든 주요 이해 관계자 모듈과 공유했습니다. 즉, 콘텐츠 처리기가 실행되기 전에 before, duringafter 요청 처리 엔진에 연결된 모듈에 구문 분석된 데이터를 제공합니다. 또한 콘텐츠 처리기가 구문 분석된 데이터를 소비했는지 또는 원시 요청 본문 자체를 소비하고 구문 재분석했는지 여부에 관계없이 하위 요청에 대해서도 작업해야 했습니다.

나는 몇 년 동안 디자인 목표를 여러 번 설명, 심지어 2012에서 개발@httpd. 그러나 그것은 항상이 사람들과 바람과 이야기하는 것과 같았고, 그들은 결코 신경 쓰지 않았습니다.

Storm Clouds 수집

이 비전은 매우 성공적이었지만 언어 바인딩은 다음과 같은 여러 언어에서 사용할 수 있습니다. Perl, PHP, TCL, R, etc., 2010 년경부터 지금까지 그것은 비극적 인 것으로 입증되었습니다. 기존 사용자 커뮤니티 그들 모두로 구성된의 구성원뿐만 아니라 Perl 커뮤니티

어떤 결과가 발생했습니까? Philip Gollucci당시 내 Perl / FreeBSD 동료가 HTTPd 서버 내부에서 프로젝트를 출시 할 것을 촉구하기 시작했습니다. 대상 필립은 그때 얼마나 완전히 잘 몰랐을까. 피비시, 바피드, 영토 이 팀은즉, 직접 협력해야 한다는 의미입니다. 사용자 대면 의사 결정 코드 베이스에 대해

2012 년 필립은 그가 원하는 것을 얻었고 저항하기를 중단했기 때문에 그는 포크됨 기존 프로젝트를 복사하고 C 라이브러리 구성 요소를 HTTPd 코어로

폴아웃

2018년 나는 재단에서 사임1. 이유를 추측할 수 있습니다.

2020년, 구글의 보안팀은 8년 된 사본의 퍼지닝을 통해 httpd 2.5의 알파 릴리즈를 활용했다. apreq2. 그들은 수리가 필요한 몇 가지 핫스팟을 발견했습니다.

빌립에게 닿는 예의를 갖지 않고, Issac Goldstand, Max Kellermann (@MaxKellermann), 나 (@joesuf4) 또는 개발과 관련된 다른 사람 libapreq2, HTTPd 팀의 주니어 엔지니어가 “버그 수정” 구글이 발견한 취약점 이후 모든 릴리스에서 해당 시도 및 오류 작업에 대한 레코드를 볼 수 있습니다.

물론 CVE의보고는 아마추어에 의해 작성되었습니다 :

  1. 버퍼 오버플로우(건축 설계에 의해)를 유발하는 것은 불가능하기 때문에, 그러한 주장들은 언제나 풍성했다; 악용 코드가 출판되지 않았다는 사실로 입증되었다.

  2. 내 최선의 노력에도 불구하고, NULL 포인터 참조가 가능했다; 주니어 개발자는 철저한 정리를 몇 년 전에했다.

  3. 나는 MIME 헤더에 대한 문자 세트 인코딩 주위에 20 년 전에 두뇌 방귀를 가지고 있었는데, 이는 잘 형성되었을 때 항상 7 비트 ASCII 깨끗합니다. 이것의 잘못 구문분석기 논리 코드베이스의 전체 역사에서 유일하게 의미있는 보안 문제였습니다. — 그리고 NPE와 마찬가지로 공격자가 할 수 있는 일은 웹 서버를 충돌시키는 것이었습니다. 물론, prefork 설정에서 이것은 해커로 발에 자신을 촬영; 하지만 @joesuf4/mod_perl, mpm_event와 HTTP/2 내부에서 실행 하는 지금 쉽게 달성할 수 있습니다. 따라서 모든 형태의 서버 충돌을 제거하는 것이 중요하고 필요한 작업이었습니다. 주니어 개발자는 @apache/apreq의 트렁크에서 그 궁극적 인 성취에 대해 많은 크레딧을받을 자격이 있습니다. 칭찬

그러나 쿠데타 드 그레이스는 2022 년 출시되었습니다. 2.17로키 개발자 The rookie developer 의도적으로 코드베이스에 치명적인 버그를 도입했습니다., 끊기 19년 된 회귀 테스트.

포스트모템

깨진 회귀 테스트 / 뛰어난 CVE가 어떻게 작동하는지 궁금하다면 CPAN 영구 설비로, 당신은 방법을 살펴해야합니다 릴렝 은(는) 서버 프로젝트에서 수행됩니다.

긴 이야기 짧은, 그들은 테스트를 언급했다. 그곳에선 어쨌든, 그것을 ‘보안 릴리스(Security Release)’라고 불렀다. 이전 릴리스마다 취약한 취약점 수정.

슈퍼맨 로고

나는 왜 지금 신경 쓰는가? I’m the sucker 내가 빨래 사용자에게 답변 요청 알려진 주제 전문가로서.

이 sucks2그러나 아파치에서 슈퍼맨 케이프를 입은 날이 약 십 년 전에 끝났다는 것을 알려드립니다.

어쨌든이 시점에서 할 수있는 최선의 방법은 libapreq2에 대한 내 생산 소스 트리를 보여줍니다. — @joesuf4/apreq(및 @joesuf4/mod_perl).

각주

  1. 하나는 단순히 “ASF에서 사직”. 깨끗한 휴식을 취하려면 ASF 회원뿐만 아니라 모든 프로젝트 / 위원회에서 사임해야합니다. 그렇지 않으면 결코 지옥의 아파치 이메일 스팸에 익사 바람.

  2. 베타 남성은 @apache/apreq 프로젝트를 mothballed하고, 베타 남성은 그들의 시간과 아무 상관이 없기 때문에, @apache/mod_perl에 움직이고 있습니다. Yann Ylavic, “로키 개발자” 그의 팀 동료가 그를 실패하는 동안 실제로 apreq에 근무하는 위의, 프로젝트를 은퇴하는 투표를 던지지 않았다. 놀랍지 않게, 그는 베타 남성이 아니라 문제 해결자입니다.