
Hyperledger Fabric 블록체인용 체인코드는 다른 체인코드에 정확한 시간을 제공합니다. 따라서 트랜잭션 시간 조작과 관련된 보안 문제(CVE-2024-45244)를 해결합니다.
hlf-time-oracle은 하이퍼레저 패브릭 블록체인용 체인코드로, 다른 체인코드에 정확한 시간을 제공합니다. hlf-time-oracle은 ntp 패키지와 nts 패키지를 기반으로 합니다. 이를 통해 블록체인 클라이언트에 의한 트랜잭션 시간 조작 가능성(CVE-2024-45244)과 관련된 보안 문제를 해결합니다. 이 체인코드는 GetTimeNtp() 및 GetTimeNts() 함수를 제공합니다. 이 함수들을 호출하면 NTP(Network Time Protocol) 및 NTS(Network Time Security) 서버에 대한 호출이 생성됩니다. 이 서버들 중 하나에서 수신된 시간은 클라이언트 측에서 정의된 트랜잭션 시간의 정확성을 검증하는 데 사용할 수 있습니다. 블록체인용 체인코드 개발자는 NTP 및 NTS 서버와 상호 작용하는 코드를 독립적으로 작성하는 대신 hlf-time-oracle을 사용할 수 있습니다. hlf-time-oracle은 작동 중에 블록체인에 데이터를 저장하지 않습니다.
Hyperledger Fabric 버전 2.4.x용 hlf-time-oracle은 hlf_2.4 폴더에 있습니다. Hyperledger Fabric 버전 2.5.x용 hlf-time-oracle은 hlf_2.5 폴더에 있습니다.
단일 시간 서버에 의존하고 싶지 않다면 여러 시간 오라클을 사용할 수 있습니다.
오라클
NTS는 NTP의 개선판입니다 (RFC 8915 참조). TLS용 TCP와 NTP용 UDP의 두 가지 연결이 있습니다. NTP 연결 포트는 NTS 서버에 의해 결정됩니다. 표준 123/UDP와 다를 수 있으므로 방화벽을 구성할 때 이 점을 유의하십시오.
올바른 TLS 연결을 설정하려면 클라이언트(즉, hlf-time-oracle이 실행되는 시스템)의 시스템 시간이 상대적으로 정확해야 합니다(NTS 서버 인증서 유효 기간 내에 있어야 함). 그렇지 않으면 연결이 설정되지 않습니다.
GetTimeNtp() 대신 GetTimeNts()를 사용하는 것이 좋습니다. NTP와 달리 NTS를 사용하면 중간자 공격에 저항할 수 있습니다. 공개 데이터 부분이 무단으로 스푸핑된 경우 다음 오류가 기록됩니다: authentication failed on client. NTS 서버 인증서를 스푸핑하려는 시도가 있는 경우 다음 오류가 기록됩니다: key exchange failure: tls: failed to verify certificate: x509: certificate signed by unknown authority.
모델
hlf-time-oracle은 docker(docker 네트워크 172.18.0.0/24)에서 실행됩니다. docker 호스트(Host_1)에서는 netsed(포트 4000/UDP)와 mitmproxy(포트 8080/TCP)가 실행 중입니다. hlf-time-oracle에서 이들로 향하는 트래픽은 iptables를 통과합니다. 두 번째 호스트(Host_2)는 Oracle의 GetTimeNtp() 및 GetTimeNts() 함수에 접근합니다(peer chaincode query 호출을 통해). 이 함수들을 호출하면 Oracle이 각각 NTP 서버와 NTS 서버를 호출하게 됩니다.
트래픽을 netsed로 리디렉션하는 iptables 규칙:
iptables -t nat -A PREROUTING -s 172.18.0.0/24 -d 213.234.203.30/32 -p udp -m udp --dport 123 -m udp -j REDIRECT --to-ports 4000
규칙을 적용하여 netsed를 실행합니다.
netsed에서 %ea%33을 %eF%33으로 바꾸는 규칙 생성
공격 성공 결과.
트래픽을 netsed로 리디렉션하는 iptables 규칙(NTS 서버 ntp1.glypnod.com의 IP 주소는 104.131.155.175):
iptables -t nat -A PREROUTING -s 172.18.0.0/24 -d 104.131.155.175/32 -p udp -m udp --dport 8123 -m udp -j REDIRECT --to-ports 4000
규칙을 적용하여 netsed를 실행합니다.
netsed에서 %ea%33을 %eF%33으로 바꾸는 규칙 생성
실패한 공격의 결과.
docker 로그를 확인합니다:
docker 로그
트래픽을 mitmproxy로 리디렉션하는 iptables 규칙(NTS 서버 ntp1.glypnod.com의 IP 주소는 104.131.155.175):
iptables -t nat -A PREROUTING -p tcp -s 172.18.0.0/24 --dport 4460 -m tcp -d 104.131.155.175 -j REDIRECT --to 8080
mitmproxy 로그를 확인합니다:
mitmproxy 로그
docker 로그를 확인합니다:
docker 로그
MIT