# 구글 프로젝트 제로의 도구를 사용한 퍼징 레이디버드

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

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=13845](https://news.hada.io/topic?id=13845)
- GeekNews Markdown: [https://news.hada.io/topic/13845.md](https://news.hada.io/topic/13845.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-03-17T09:58:26+09:00
- Updated: 2024-03-17T09:58:26+09:00
- Original source: [awesomekling.substack.com](https://awesomekling.substack.com/p/fuzzing-ladybird-with-tools-from)
- Points: 1
- Comments: 1

## Topic Body

### Google Project Zero 도구를 사용한 Ladybird 퍼징

- **Domato**는 Google Project Zero에서 개발한 DOM 퍼저로, 대량의 주로 유효하지만 이상한 HTML, CSS, JavaScript를 포함한 웹 페이지를 생성함.
- 생성된 웹 페이지는 약 500 KiB 크기로, 브라우저 엔진을 놀라게 할 "흥미로운" JS, CSS, HTML로 가득 차 있음.
- Domato는 주요 브라우저에서 많은 버그를 발견했다고 하며, 이를 Ladybird에 적용하여 문제를 발견하고 수정함.

#### Issue #1: `&lt;th&gt;` 태그가 `&lt;mfrac&gt;` 안에 있을 때

- Domato가 생성한 출력에서 `&lt;mfrac&gt;` 안에 `&lt;th&gt;`를 넣는 문제를 발견함.
- UBSAN(Undefined Behavior SANitizer)을 사용하여 컴파일한 Ladybird에서 null 포인터 참조 오류가 발생함.
- `&lt;th&gt;`와 `&lt;td&gt;` 요소를 항상 `&lt;table&gt;`이 DOM 트리 상위에 있다고 가정하여 구현했으나, JavaScript API를 사용하여 DOM 노드를 수동으로 생성할 때는 이러한 규칙을 어길 수 있음.
- 문제 해결을 위해 `&lt;th&gt;`와 `&lt;td&gt;` 요소가 항상 `&lt;table&gt;`을 포함하고 있다고 가정하지 않고, `first_ancestor_of_type&lt;HTMLTableElement&gt;()`를 사용하여 수정함.

#### Issue #2: 분리된 DOM에서 window 이벤트 핸들러 할당

- 퍼저를 실행하면서 또 다른 문제에 빠르게 부딪힘.
- `DOMParser`를 통해 생성된 문서는 window 객체가 없으며, 이로 인해 문제가 발생함.
- `Document::window()`가 nullable 값을 반환하도록 수정하고, 여러 곳에서 null 처리를 함.
- window 없는 문서에서 `document.body.onblur`를 할당할 때 아무 것도 하지 않도록 수정함.

#### Issue #3: SVG `&lt;linearGradient&gt;`에서 무한 재귀

- SVG는 다른 그라디언트를 참조하여 색상을 상속받는 그라디언트를 선언할 수 있음.
- 그라디언트가 자기 자신을 참조하는 경우를 고려하지 않아 무한 루프가 발생함.
- 참조 사이클이 여러 단계에 걸쳐 있는 경우를 처리하기 위해 방문한 모든 그라디언트를 추적하고, 이미 방문한 그라디언트를 만나면 체인을 따르는 것을 중단함.

#### Issue #4: 제거된 iframe의 window 속성 접근

- iframe이 DOM에서 제거되면 해당 콘텐츠 문서가 브라우징 컨텍스트에서 분리됨.
- window 객체의 속성에 접근할 때 브라우징 컨텍스트의 존재를 가정하는 HTML 사양의 버그 발견.
- HTML 사양에 대한 이슈를 제기하고, Ladybird에서는 null 검사를 추가하여 문제를 해결함.

#### Issue #5: `Element.before()`에서 무한 루프

- 페이지가 로드되지 않고 CPU 사용률이 100%로 유지됨.
- `before()` 구현의 오류로 인해 무한 루프가 발생함.
- `node->previous_sibling` 대신 `previous_sibling->previous_sibling`을 통해 형제 체인을 따라가도록 수정함.

### 결론

- 하루 동안 실제 버그 5개를 발견하고 모두 수정함.
- 퍼저와 같은 도구는 소프트웨어를 더욱 견고하게 만들고자 하는 사람들에게 놀라운 자원임.
- Ladybird가 지속적인 퍼징 입력을 처리할 수 있을 정도로 안정화되면, 클라우드에서 자동으로 실행하여 더 많은 문제를 발견할 수 있을 것임.

### GN⁺의 의견

- 이 기사는 Ladybird 브라우저 엔진이 Google Project Zero의 Domato 퍼저를 사용하여 발견한 버그들을 수정하는 과정을 설명함.
- 퍼징은 소프트웨어의 보안 취약점을 발견하는 데 매우 효과적인 기술로, 개발자들이 자신의 코드를 더 견고하게 만들기 위해 사용할 수 있음.
- 이 기사는 개발자들에게 퍼징의 중요성을 일깨우고, 실제로 어떻게 적용되는지에 대한 통찰력을 제공함.
- 비판적으로 볼 때, 퍼징은 예상치 못한 입력에 대한 소프트웨어의 반응을 테스트하는 것이므로, 실제 사용자의 사용 패턴을 완전히 반영하지는 않을 수 있음.
- 비슷한 기능을 제공하는 다른 퍼징 도구로는 AFL(American Fuzzy Lop)이나 LibFuzzer 등이 있으며, 개발자들은 이러한 도구들을 사용하여 자신의 프로젝트를 테스트할 수 있음.
- Ladybird 개발자들은 이 기술을 도입함으로써 발견된 버그를 수정하여 브라우저의 안정성을 향상시킬 수 있으며, 이는 사용자 경험을 개선하고 보안을 강화하는 데 도움이 될 것임.

## Comments



### Comment 23761

- Author: neo
- Created: 2024-03-17T09:58:26+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=39725057) 
- 다양한 구현을 통해 스펙의 가치가 입증됨
  > 스펙에 대한 다양한 구현이 중요한 이유가 이 글을 통해 드러남. 이미 한 가지 문제가 발견되었고, 더 있을 것으로 예상됨.

- 소규모 그룹도 놀라운 것을 만들 수 있는 가능성
  > 소규모 그룹이 놀라운 프로젝트를 진행하는 것에 대한 열정을 표현함. 이는 이해관계자가 있는 회사에서는 어려운 일임.

- SVG 구현으로 프로젝트의 빠른 진행에 놀라움
  > 프로젝트가 예상보다 빠르게 진행되고 있으며, SVG 구현이 완료되었다는 소식에 매료됨을 표현함.

- 소프트웨어 개발 시 문제 해결에 대한 심층적 접근 필요성
  > 개발자들이 문제를 발견하고 수정하는 것에 그치지 말고, 문제의 근본 원인을 이해하고 전체 코드베이스에서 유사한 오류를 찾아내야 한다고 주장함. 현대 소프트웨어의 불안정함과 버그 문제는 자본주의의 제약으로 인한 것이지만, 더 나은 소프트웨어 개발이 가능하다고 강조함.

- Ladybird의 웹 엔진 해커페스트 참여 여부에 대한 궁금증
  > Ladybird가 올해 웹 엔진 해커페스트에 참여할지에 대한 관심을 표현함.

- 해킹 관련 유튜브 비디오의 부재에 대한 의문
  > 해킹 관련 유튜브 비디오가 더 이상 업데이트되지 않는 것에 대한 아쉬움을 표현함.

- "fuzzing ladybird"라는 단어 조합에 대한 재미있는 반응
  > "fuzzing ladybird"라는 단어 조합이 재미있고 야만적으로 들린다는 의견을 제시함.

- Ladybird가 세계를 장악할 수 있기를 비밀리에 희망함
  > Ladybird가 언젠가 세계를 장악할 수 있기를 비밀리에 바라며, 이를 아무에게도 말하지 말라고 당부함.

- [삭제된 댓글]
  > 특정 댓글이 삭제되었음을 알림.
