https://fuzzinglabs.com/solana-agave-vm-crypto-syscall-vulnerability/
공개된 취약점은 포세이돈 해시 함수가 서로 다른 Input 값에 대해서 같은 hash 값을 내뱉는 충돌 문제였습니다
간단히 설명하면 우리는 해시 함수를 쓸 때 Input이 달라지면 hash 결과 값도 달라진다라는 가정을 갖고 있습니다. 하지만 Input에 대한 길이 검증을 제대로 수행하지 않았고, Input의 길이가 작을 때에도 허용해버리는 검증 부족 이슈가 있었습니다. 이에 따라 문자열을 숫자로 해석할 때 서로 다른 Input이 같은 숫자로 해석될 수 있는 문제가 존재합니다. 예를 들어 아래의 서로 다른 Input 값들이 모두 정수 1로 해서되는거죠
[0x01] = 1
[0x01, 0x00] = 1 + 0 * 256 = 1
[0x01, 0x00, 0x00] = 1 + 0 * 256 + 0 * 256^2 = 1
결과적으로 해시 함수가 수행되기 전부터 서로 다른 Bytes가 하나의 동일한 정수 Input으로 해석되고 결과적으로 같은 해시 값이 나오게 됩니다. 해시 함수 자체의 문제라기보다는 해시 함수를 사용하기 전에 Bytes를 숫자로 해석하는 과정에서 서로 다른 Bytes가 동일한 숫자로 해석될 수 있는 버그라고 볼 수 있겠네요.
해당 버그는 Solana의 벨리데이터 코드인 Agave에 존재했었고, Agave의 포크인 Jito에도 동일하게 존재하였습니다. 특이한건 FIREDANCER는 아예 별개로 구축된 것임에도 불구하고 같은 취약점이 존재했습니다.
Validator마다 다르게 구현되어 있었다면 같은 거래를 두고 서로 다른 결과를 계산해 네트워크 합의가 깨질 수 있었던 문제로 이어질 수 있었습니다.
다행히 합의 문제로 이어지지 않더라도, 잘못된 해시 결과의 고유성을 믿는 프로그램에서는 중복 청구, 중복 발행, 잘못된 소유권 매핑 같은 문제가 발생할 수 있었습니다.
해당 이슈는 2025년 1월에 발견되었는데, 2025년 말경에 패치되었고 최근 4월에 바운티를 받았다고 하네요.
