본문 바로가기

자주나오는패턴

[Common Vulnerabilities] Missing Protection against Signature Replay Attacks

컨트랙트에서 서명을 검증하는 경우에 서명을 한 번만 사용해야 한다. 그렇지 않으면 공격자가 동일한 서명으로 여러 번 검증을 통과하여 특정한 프로세스를 수행할 수 있다. 

 

그것을 방지하기 위한 세가지 방법이 있다. 

1. 모든 서명은 저장한다. 새 메시지가 나오면, 기존에 있던 것인지 체크한다.

2. 서명에 처리하는 컨트랙트의 주소를 포함한다. 그러면 해당 컨트랙트에서만 처리될 수 있다. 

3. 서명을 포함한 메세지 해시를 생성하지 않는다.

 

참고자료에 예~전에 발생했던 보안사고가 있는데 SMT라는 토큰에서 transferProxy라는 함수를 만들어서 사용했는데 여기서 overflow문제가 발생해서 거의 무한대에 가까운 토큰이 발행된 사건이다. SMT사건은 overflow문제로 발생한 것인데 4번 참고자료에서는 서명을 다시 사용하는 replay공격에 대해서 다루고 있다. 

 

 

[ 참고 및 추가자료 ]

1. https://swcregistry.io/docs/SWC-121/

2. https://swcregistry.io/docs/SWC-117/

3. https://medium.com/onther-tech/smt-%ED%86%A0%ED%81%B0-%EC%9D%B4%EC%A4%91%EC%A7%80%EB%B6%88-%ED%95%B4%ED%82%B9-%EC%84%A4%EB%AA%85%EA%B3%BC-%EB%8C%80%EB%B9%84%EC%B1%85-8bef3f41bcd2

4. https://medium.com/cypher-core/replay-attack-vulnerability-in-ethereum-smart-contracts-introduced-by-transferproxy-124bf3694e25