본문 바로가기
aaa
블록체인

[이더넛] 레벨8 'Vault' 풀기

[이더넛] 레벨8 'Vault' 풀기

[목표]

스마트컨트랙트 Vault의
변수 password는
private으로 선언 되어있다.

스마트컨트랙트 Vault의
password를 알아내보자.

이를 통해 암호화 되지 않은 변수를
스마트컨트랙트에 기입하는 것이
얼마나 보안에 취약한지 알아보자.

 

 

Full Code
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract Vault {
  bool public locked;
  bytes32 private password;

  constructor(bytes32 _password) public {
    locked = true;
    password = _password;
  }

  function unlock(bytes32 _password) public {
    if (password == _password) {
      locked = false;
    }
  }
}

bytes32 private password;

Vault의 컨트랙트를 보면

private으로 선언되어 있습니다.

 

private은 public과 달리

해당 스마트컨트랙트에서만 사용할 수 있습니다.

얼핏보면 프라이빗이니까 안전할 것 같지만

그렇지 않습니다.

 

private으로 선언된 변수 또한

공개적으로 접근가능하고

변수를 확인할 수 있습니다.

 

 

먼저 타겟 스마트컨트랙트의 잠금상태를 확인했습니다.

'true'로 잠겨있습니다.

 

 

web3를 통한 변수확인

web3.eth.getStorageAt ~ 

명령어를 통해 스마트컨트랙트내의

변수를 확인 할 수 있습니다.

 

await web3.eth.getStorageAt("0xc2Ea18443627507421765B7D2F9e5f9B3Bb150eb",1)

 

 

이더넛 콘솔창에서 위와 같이

스마트컨트랙트 주소와, 인덱스 값을 넣어주면

해당 스마트컨트랙트에 있는

인덱스 위치의 데이터를 리턴 받습니다.

 

password는 컨트랙트 내에서

2번째로 선언되어 있으니 인덱스 값은 1입니다.

 

생각보다 너무 쉽게

password를 알아냈습니다.

 

unlock을 호출하여

위에서 알아낸 password를 입력하면

클리어~!

 

 

 

zk-SNARK
zero-knowledge Succinct Non-interactive Argument of Knowledge

이렇게 블록체인 상에 기록된 변수는 모두 공개되어 있습니다.

이러한 이유 때문에 온체인에는 변수를 암호화해서 저장하고

해독키는 절대 온체인에 공개되지 않게 하는 것이 보안에 있어 중요합니다.

 

zk-SNARK은 공개되지 않아야할 파라미터를 드러내지 않고 

누군가 해당 파라미터를 알고있는지 검증하는 프로세스(영지식 증명)를 제공합니다.

 

zk-SNARK을 사용하는 대표적인 코인은 지캐시가 있습니다.

 

https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/

 


loading