CVE-2018-17144: Bitcoin Core DoS, Critical Inflation Vulnerability
Intro
https://medium.com/@awemany/600-microseconds-b70f87b0b2a6
원문은 여기
CVE-2018-17144는 Bitcoin Core에서 발생한 취약점이다. 처음엔 Remote DoS로 알려졌으나 나중에 임의의 비트코인을 찍어낼 수 있다는 것까지 연구가 되어 더욱 파급력이 생겼다.
현실판 돈복사버그..
비트코인 투자를 해봤던 사람으로써 취약점이 궁금해 공개된 내용들과 bitcoin-core 소스 오디팅해서 대략 어떤식으로 발생한 버그인지 정리해보았다.
Root Cause
https://github.com/bitcoin/bitcoin/pull/9049
#9049 PR에 버그가 존재한다. 문제가 생긴 커밋을 보면
![](https://blog.saika.kr/wp-content/uploads/2019/04/image-4-1024x862.png)
1131 Line : Check for duplicate inputs – note that this check is slow so we skip it in CheckBlock
PR request한 사람이 남긴 코멘트인데 뇌피셜이지만 bitcoin-core 취약점을 고의로 만들려는 자객인거같다ㅋㅋㅋ 앞으로 오픈소스 오디팅할때 주석 검색해볼 목록에 this check is slow 이런거 추가해놔야겠다,,
![](https://blog.saika.kr/wp-content/uploads/2019/04/image-5-615x1024.png)
코드를 읽어보면 인자로 받은 같은 transaction의 tx.vin(cOutPoint 구조체)들의 prevout을 vInOutPoints 임시 이터레이터에 넣어보면서 .count로 validate하는데 이 검증로직이 저 PR로 없어졌다 이제 한 트랜잭션에 같은 prevout을 가진 vin을 중복해서 넣을 수 있게되었다.
문제는 이 CheckTransaction() 함수가 mempool에 삽입될 새로운 transaction들을 검증하는 로직에 모두 쓰였다는 것이다.
![](https://1.bp.blogspot.com/-ZBvx7M5DRl8/W6jzGuy9VVI/AAAAAAAACtY/GY72XZSKD88pThhhX5bMav3qh7VdsLmHACLcBGAs/s1600/Screen%2BShot%2B2018-09-24%2Bat%2B11.18.17%2BPM.png)
![Screen+Shot+2018-09-24+at+11.23.10+PM.png (1600Ã414)](https://2.bp.blogspot.com/-TEleGewEzhA/W6jzZeAnLkI/AAAAAAAACtg/Q1He5tj8mJYTrNUlkgtHsgT3u0Ut6o5tQCLcBGAs/s1600/Screen%2BShot%2B2018-09-24%2Bat%2B11.23.10%2BPM.png)
mempool은 컨펌을 대기중인 transcation들이 저장되어 채굴자들이 블록을 생성할때 포함시키는 용도로 쓰이는데, 신기했던 점은 이 bug를 disclosure한 사람인 @awemany에 따르면 mempool에서 이미 검증과정을 통과했으므로 채굴자가 블록을 마이닝할때는 transaction에 대한 별도 검증을 하지않는다는걸 테스트를 통해 확인했다고한다.
따라서 만약에
트랜잭션이 “블록에 올라가면” tx.vin 구조체의 prevout의 주소의 코인은 사용불가능하도록되면서 거래가 이루어지기때문에 본 취약점을 악용해 duplicate prevout input을 가지고있는 트랜잭션을 mempool에 보내 취약한 검증과정을 통과하고 블록에 accept되면 자기 지갑의 비트코인을 복제해 중복 출금이 가능해진다.
Conclusion
분석이 어렵거나 한 것도 아니였고 비트코인 구조만 머리에 있다면 이해하기 쉬운 버그였다..
웃긴건 원래 소스는 안취약했는데 어떤 유저(troll?)가 0.5~0.7ms를 아낄수있다며 validation을 지우고 request한 PR이 제대로 리뷰를 안거치고 approve되었고 유닛테스트의 code coverage가 불충분해서 그냥 테스트를 통과해 메인 브랜치에 merge되면서 탄생된 취약점이라 재밌었다.
더재밌는건 이 어마어마한 취약점을 responsible disclosure한 @awemany는 bitcoin 재단한테 바운티를 한푼도 못받았다고한다ㅋㅋㅋㅅㅋㄷㅇㅈㅋㅋ
https://github.com/bitcoin/bitcoin/commit/c64128df5882e8dc1f76ae7c1e998ed57b8645fe#diff-bb164712e06aa669cbef899af79e8cdb
![Screen+Shot+2018-09-25+at+2.48.24+AM.png (1600Ã1194)](https://1.bp.blogspot.com/-iYHVTzW1dzo/W6kjflwMuMI/AAAAAAAACt4/5qAA7QyVLrEaWA-c7bvjHVlOWjGcD0lvwCLcBGAs/s1600/Screen%2BShot%2B2018-09-25%2Bat%2B2.48.24%2BAM.png)
이런 케이스를 커버하는 테스트가 추가되었고 무조건 duplicate input인지 체크하도록 패치가 된 것을 확인 할 수 있다.
Recent Comments