
2025년 1월 16일, SSP Wallet v1.9.0이 SSP의 Account Abstraction Solidity 컨트랙트 — 모든 Ethereum과 Sepolia 주소 뒤에 있는 Factory와 Account Implementation — 에 대해 Halborn과 함께 진행한 수 주간의 보안 점검을 마무리합니다. 감사는 중요한 지점에서 깔끔하게 끝났고, 발견된 것은 Informational 3건과 Low 2건뿐이었으며, 모두 사용되지 않거나 죽은 코드에 있었습니다. 그럼에도 우리는 각 항목을 모두 다루고, 컨트랙트를 다시 배포하고, 더 정리된 버전을 v1.9.0에 실어 보내기를 택했습니다. 이 재배포는 Ethereum과 Sepolia 사용자에게 호환성을 깨는 변경입니다. 업그레이드 이후 두 체인에서의 결정론적 주소가 바뀝니다.
TL;DR
- Halborn은 SSP Account Abstraction의 Solidity 측, 즉 Factory와 Account Implementation 컨트랙트를 감사했습니다.
- 결과: Informational 3건, Low 2건, Medium 0건, High 0건. 모두 미사용 또는 죽은 코드 경로에 있습니다. 이전에 배포된 컨트랙트들은 안전했으며 지금도 안전합니다.
- 코드베이스를 완전히 깨끗하게 유지하기 위해 그럼에도 재배포를 진행했습니다 — 새로운 Factory와 Account Implementation 컨트랙트가 v1.9.0과 함께 나옵니다.
- 호환성을 깨는 변경: Ethereum과 Sepolia 주소가 업그레이드 이후 바뀝니다. 업그레이드 전에 자금을 옮기거나, SSP 지원팀에 연락해 마이그레이션 가이드를 받으세요.
- UTXO 체인 — Bitcoin, Zcash, Bitcoin Cash, Flux — 는 영향을 받지 않습니다.
Halborn이 감사한 범위
범위는 v1.6.0에서 출시하고 그 이후로 발전시켜 온 Schnorr 멀티시그 ERC-4337 컨트랙트의 Solidity 측이었습니다. 구체적으로는 @runonflux/account-abstraction 저장소 — 사용자가 처음 거래할 때 결정론적으로 계정을 배포하는 Factory 컨트랙트, 그리고 그 계정이 UserOperations를 어떻게 검증하고 Schnorr 서명을 어떻게 확인하며 ERC-4337의 bundler-와-EntryPoint 흐름을 어떻게 따르는지를 정의하는 Account Implementation 컨트랙트입니다.
Halborn 기술팀은 운영용 스마트 컨트랙트에 대해 전개하는 전체 테스트 묶음을 그대로 돌렸습니다. 저장소는 그들의 표현으로 견고하고, ERC-4337 권장사항을 존중하며, Schnorr를 깔끔하게 구현하고 있습니다. 그 결론이 중요한 이유는, Schnorr 구현이 설계에서 선례가 가장 적은 부분이기 때문입니다 — AA 스택의 다른 모든 조각들은 업계에서 여러 차례 감사되었지만, ERC-4337 검증기 내부에서의 집계된 Schnorr 서명은 우리가 직접 만든 것입니다.
무엇을 발견했는가
리포트에는 Informational 3건과 Low 2건의 발견이 있습니다 — Medium도, High도, Critical도 없습니다. 전체 리포트는 halborn.com/audits/influx-technologies/account-abstraction-schnorr-multisig에서 읽을 수 있습니다.
각 발견은 운영 컨트랙트에서 사용되지 않거나, 실제 사용자 자금에 대해 실행되지 않는 경로의 일부였던 코드 — 방어적 비계, 이전 이터레이션에서 남은 분기 같은 것들 — 에 자리 잡고 있습니다. 어느 것도 공격자가 자금을 가져가거나, 서명을 위조하거나, 계정을 무너뜨릴 수 있는 길을 설명하지 않습니다. Ethereum 메인넷에 배포된 컨트랙트는 감사 기간 동안과 그 이후로 완전히 안전한 상태를 유지했습니다.
그럼에도 재배포한 이유
두 가지 이유입니다. 첫째, 깨끗한 코드베이스는 그 자체로 보안의 한 형태입니다. 배포된 컨트랙트로 컴파일되어 들어간 죽은 코드는, 미래의 감사자와 통합자, 기여자들이 따져보아야 할 죽은 코드입니다. 그것을 잘라내면 앞으로의 모든 검토가 마주해야 할 표면이 줄어듭니다 — 분기가 줄고, 가정이 줄고, 컨트랙트를 잘못 읽을 가능성이 줄어듭니다.
둘째, 발견을 미루는 버전 대신 발견을 모두 다루는 버전을 출시할 기회가 있을 때는 그것을 택합니다. 우리도 그렇게 했습니다. v1.9.0은 Halborn의 모든 권고를 반영한 새로 배포된 Factory와 Account Implementation 컨트랙트를 대상으로 출시됩니다. @runonflux/account-abstraction 저장소의 안정 브랜치는 이제 main(npm ^1.1.0)이며, 기존 배포 컨트랙트에 머무르고 싶은 분들을 위해 master 브랜치와 npm ~1.0.0도 계속 제공됩니다.
Ethereum과 Sepolia 사용자에게 호환성을 깨는 변경
Factory가 바로 여러분의 공개키로부터 계정 주소를 결정론적으로 유도하는 부품이므로, Factory를 재배포한다는 것은 같은 키들이 다른 주소를 유도한다는 뜻입니다. Ethereum 메인넷이나 Sepolia에 자금을 가진 사용자에게는 이것이 v1.9.0의 실질적 영향입니다. 업그레이드 이후 SSP가 보여주는 Ethereum 또는 Sepolia 주소는 새 주소입니다. 이전 주소에 남아 있는 ETH나 ERC-20은 저절로 옮겨가지 않습니다.
안전하게 처리하는 두 가지 방법이 있습니다. 직선적인 길은 업그레이드 전에 자금을 이전 주소 밖으로 옮기는 것입니다 — 다른 지갑이나 거래소로 보낸 다음 업그레이드하고, 다시 새 주소로 보내십시오. 다른 길은 이미 업그레이드했거나 더 크고 복잡한 포지션을 가진 사용자를 위한 것으로, SSP 지원팀에 연락해 마이그레이션 가이드를 받는 것입니다. 그러면 우리가 옛 컨트랙트를 이용해 옛 자금을 회수하는 과정을 함께 진행해 드립니다.
UTXO 체인은 영향을 받지 않습니다. Bitcoin, Zcash, Bitcoin Cash, Flux 주소는 EVM 컨트랙트를 거치지 않고 여러분의 키에서 유도되므로 v1.9.0이 이 주소들을 바꾸지 않습니다. 관련된 것은 Ethereum과 Sepolia뿐입니다.
앞으로의 이야기
이 글은 출시 당일의 AA 컨트랙트 감사만을 다룹니다. 더 큰 그림 — SSP 지갑, 컨트랙트, SDK에 걸친 Halborn의 전체 감사 — 은 SSP의 2025년 Halborn 감사 안쪽에 펼쳐져 있으며, 이번 감사를 다른 두 감사의 맥락 안에 함께 놓습니다.