ZAP의 새로운 Networking Stack
지난 목요일 밤 ZAP Developers Groups에 simon이 한가지 내용을 공유했습니다. 바로 ZAP의 Networking Layer에 대한 이야기고, 저는 제목을 보자마자 어떤 내용인지 직감했습니다. (제가 정말 기다렸던 내용이거든요 🤩)
어떤 것을 개선하기 위해 이러한 작업이 진행되었는지, 그리고 어떻게 바뀌었고 앞으로 어떻게 될지 미리 살펴봅시다 :D
Why?
먼저 Networking stack, layer는 실제로 사용자에게 보이는 부분은 별로 없습니다. Application 내부에서 네트워크를 처리하기 위한 부분인데, ZAP은 오래된 프로젝트다 보니 베이스로 사용된 Networking 부분이 오래된 Apache Commons HttpClient library를 사용했었습니다. 그러다 보니 HTTP/2부터 비정상 HTTP 요청 등을 처리하지 못하고 있어서 ZAP의 큰 단점 중 하나였었죠.
저도 여러번 ZAP Core에 이야기헀었고, ZAP Core도 이를 잘 알고 있어 오래전부터 준비해왔던 것 같습니다.
Build and Review
아직 공식 릴리즈는 좀 멀었겠지만 미리 써봐야 속이 시원하겠죠? 먼저 ZAP 2020-02-10자 weekly 버전을 받아봅시다. 아직 패키지 릴리즈도 안된 따끈따끈한 상태라 코드 압축밖에 없네요 ㅜㅜ
jar파일이 없기 때문에 받아서 빌드해서 살펴보겠습니다. 저는 종종 ZAP에 PR을 하거나 만들어 쓰는 것들이 있어서 개발 환경이 세팅되어 있는데요, 혹시나 따라하신다면 Java 설치와 관련 repository를 미리 clone 해두어야 합니다.
# weekly download
wget https://github.com/zaproxy/zaproxy/archive/refs/tags/w2022-02-10.zip
unzip w2022-02-10.zip
# dependency
git clone https://github.com/zaproxy/zap-extensions
git clone https://github.com/zaproxy/zap-core-help
git clone https://github.com/zaproxy/zap-hud
다 받았으면 ./w2022-02-10
디렉토리로 들어가서 빌드를 시작해보죠. 먼저 ZAP Core에는 Addon이 빠져있기 때문에 Addon부터 설치해야합니다.
➜ w2022-02-10 ./gradlew :zap:copyWeeklyAddOns
> Task :zap:copyWeeklyAddOns
Running tasks for zap-extensions
<-------------> 0% EXECUTING [36s]
> :zap:copyWeeklyAddOns
....
BUILD SUCCESSFUL in 11m 11s
18 actionable tasks: 1 executed, 17 up-to-date
테스트를 인텔맥에서 해서 그런가 10분이나 소요됬네요.. WeeklyAddon이 설치되셨으면 :zap:run
으로 빌드하면서 바로 실행해주시면 됩니다.
➜ w2022-02-10 ./gradlew :zap:run
Starting a Gradle Daemon, 1 busy and 1 incompatible Daemons could not be reused, use --status for details
<-------------> 0% EXECUTING [1m 25s]
> IDLE
> :zap:compileJava
> IDLE
....
> Task :zap:run
1441 [AWT-EventQueue-0] INFO org.parosproxy.paros.network.SSLConnector - Reading supported SSL/TLS protocols...
1441 [AWT-EventQueue-0] INFO org.parosproxy.paros.network.SSLConnector - Using a SSLEngine...
1505 [AWT-EventQueue-0] INFO org.parosproxy.paros.network.SSLConnector - Done reading supported SSL/TLS protocols: [SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2, TLSv1.3]
1506 [AWT-EventQueue-0] INFO org.parosproxy.paros.extension.option.OptionsParamCertificate - Unsafe SSL renegotiation disabled.
1802 [AWT-EventQueue-0] INFO hsqldb.db.HSQLDB379AF3DEBD.ENGINE - dataFileCache open start
1805 [AWT-EventQueue-0] INFO hsqldb.db.HSQLDB379AF3DEBD.ENGINE - dataFileCache commit start
New features
기존에 Options 내 Local Proxies와 Dynamic SSL Certificates가 Network 하위로 옮겨졌습니다. Pass-through
란 기능이 생겼습니다.
- Alias: 아직 추가된 기능이 아닌 것 같아요. 그냥 틀만 있는 느낌
- Pass-through: ZAP이 bypass 할 패턴을 명시할 수 있어요. client의 피닝을 우회할 수 없을 떄 동작에 지장주지 않으면서 테스트하기 좋겠네요.
Certificate 에서도 Root CA의 유효기간을 직접 설정해서 사용할 수 있게 되었네요.
추가된 기능은 여기까지 입니다.
Next level
사실 여기부터가 제일 중요합니다. 아마 공식 릴리즈가 나올떄는 이부분을 적용해서 나올 것 같습니다. ZAP Core에서 앞으로 HTTP/2, HTTP/3 지원과 비정상 HTTP Request 지원을 진행한다고 하고 이것의 우선순위는 높다고 했습니다. 그래서 조만간 HTTP/2 지원이 되지 않을까 싶습니다 👏🏼
References
- https://github.com/zaproxy/zaproxy/releases/tag/w2022-02-10
- https://www.zaproxy.org/blog/2022-02-10-new-zap-networking-layer/