탈중앙화 금융(DeFi) 분야에는 수많은 보안 위험이 있으며, 이는 사용자, 플랫폼, 전체 금융 생태계에 심각한 피해를 줄 수 있습니다.DeFi 보안 위험 3가지 유형을 요약하고, 최근 실제 보안 사고를 분석하여 해커 공격 과정과 대응 방안을 설명했다.
- 가격 조작 위험 
- 스마트 계약 취약성 위험 
- 사용자 조작 위험 
1. 가격조작 리스크
DeFi에서 가격 조작 위험은 자산 가격을 조작하여 시장에 이익을 주거나 영향을 미치려는 악의적인 행위자를 의미합니다.이러한 조작은 시장 가격의 비정상적인 변동으로 이어질 수 있으며 다른 참여자에게 손실을 초래할 수 있습니다.아래에서는 DeFi에서 가격 조작 위험이 발생할 수 있는 세 가지 상황을 요약합니다.
- 플래시 대출 공격 
- 샌드위치 공격 
- 오라클 공격 
1.1 플래시대출 공격
플래시론 공격은 DeFi 애플리케이션에서 나타나는 공격 방식이다. 담보를 제공하지 않고 돈을 빌릴 수 있는 금융 운영인 플래시 론(Flash Loan)을 활용합니다.공격자들은 플래시론을 통해 거액의 돈을 빌린 뒤 동일한 거래 내에서 일련의 작전을 수행해 사기를 저지른다.
시도글로벌 플래시론 공격 사건
2023년 6월 23일, BSC(바이낸스 스마트 체인)에서 ShidoGlobal 플래시 대출 공격이 발생했습니다. 공격자는 잠금 및 청구 메커니즘과 두 풀 간의 가격 차이를 통해 토큰 차익거래를 달성합니다.976 WBNB를 성공적으로 훔쳤습니다.
Attack Tx:
공격자는 플래시 대출 공격을 어떻게 수행합니까?
- 공격자는 40WBNB의 플래시 대출을 받았습니다. 

- 공격자는 39개의 WBNB를 10, 436, 972, 685, 676, 390, 697 Shido Inu: SHIDO 토큰(소수점 9자리)으로 교환하고 이를 PancakeSwap V2: SHIDO-WBNB 풀에 입금했습니다. 이 조치는 풀에 있는 Shido Inu: SHIDO 토큰의 공급을 증가시켜 토큰 가격을 감소시킵니다. 

- 그런 다음 공격자는 ShidoLock.lockTokens 및 ShidoLock.claimTokens를 차례로 호출하여 10, 436, 972, 685.676390697 Shido Inu: SHIDO 토큰(소수점 9자리)을 10, 436, 986, 704, 133, 494, 387, 000, 000으로 변환했습니다. , 000 SHIDO 토큰(소수점 18자리). 
공격자가 ShidoLock 계약에서 lockTokens 함수를 호출하면 계약에서 10, 436, 972, 685.676390697 Shido Inu: SHIDO 토큰을 잠급니다. 이는 특정 조건이 충족될 때까지 이러한 토큰을 전송하거나 거래할 수 없음을 의미합니다. 공격자는 토큰을 잠김으로써 토큰의 가격 안정성을 어느 정도 유지할 수 있습니다.
공격자는 ClaimTokens 함수를 호출하여 잠긴 토큰을 10, 436, 986, 704, 133, 494, 387, 000, 000, 000 SHIDO 토큰으로 변환했습니다. 이 단계는 SHIDO 토큰의 소수 자릿수를 9에서 18로 효과적으로 늘려 토큰의 총 공급량을 늘립니다.

- PancakeSwap V2: SHIDO-WBNB 풀과 PancakeSwap V2: SHIDO 28 풀 사이에는 잠금 및 청구 메커니즘을 통해 가격 차이가 있습니다. 특히 PancakeSwap V2: SHIDO-WBNB 풀에서 SHIDO 토큰 공급 증가로 인해 가격이 하락했습니다. PancakeSwap V2: SHIDO 28 풀에서는 공급이 증가하지 않아 가격이 상대적으로 높습니다. 공격자는 이러한 가격 차이를 이용하여 두 풀 간에 토큰을 교환하여 10, 436, 986, 704, 133, 494, 387, 000, 000, 000 SHIDO 토큰(소수점 이하)을 보다 유리한 가격으로 전송했습니다. 18 비트)을 1,016 WBNB로 교환했습니다. 

- 결국 공격자는 플래시론 40WBNB를 상환하고 약 976WBNB의 수익을 얻었다. 

플래시대출 기능 제한
플래시론 기능 제한 및 플래시론 수수료 도입플래시론 공격과 조작의 위험을 줄이는 일반적인 방법입니다.
- 플래시론 기능 제한 : 최소대출금액, 대출기한 설정 등 플래시론 기능을 제한할 수 있습니다. 이렇게 하면 공격자가 플래시 대출을 사용하여 공격을 수행할 가능성이 줄어듭니다. 
- 플래시 대출 취급 수수료 소개: 대출자에게 특정 취급 수수료가 부과될 수 있습니다. 이는 공격 비용을 증가시켜 공격자가 플래시 대출 공격을 수행할 때 더 높은 위험과 비용에 직면하게 만들 수 있습니다. 

위 샘플 코드에서는 플래시론 기능의 사용을 제한하기 위해 최소 대출 금액, 최대 대출 금액, 대출 시간 등 몇 가지 제한 사항을 설정했습니다. 플래시론 업무를 수행하기 전, 먼저 취급 수수료의 일정 비율을 계산하여 청구합니다.
1.2 샌드위치 공격
샌드위치 공격(Sandwich Attack)은 탈중앙화거래소(DEX)의 정보 비대칭성을 활용한 공격 방식이다.공격자는 두 거래 사이에 악의적인 거래를 삽입해 가격 차이를 이용해 이익을 얻습니다.
CurveFinance 샌드위치 공격
2023년 8월 2일, Hypernative Systems는 Curve Finance에 샌드위치 공격을 시작했습니다. 공격자는 유동성을 추가하고 유동성을 제거하는 두 거래 사이에 악의적인 거래를 삽입합니다.36.8K USDT를 획득하세요.
Attack Tx:
공격자는 샌드위치 공격을 어떻게 수행합니까?
- 공격자는 wstETH, WETH, USDT를 포함한 여러 자금 출처로부터 막대한 플래시 대출을 받았습니다. 

- 공격자는 3개의 풀에 155,000,000 USDT 유동성을 제공하고 3개의 CRV LP 토큰을 획득했습니다. 3 CRV는 공격으로 손상된 채굴풀인 Curve TriPool(Curve DAI/USDC/USDT 채굴풀)의 LP 토큰입니다. 

- 공격자는 풀에서 (거의 모든) DAI 및 USDC 유동성을 제거하고 3개의 CRV LP 토큰을 파괴했습니다. 이 시점에서 풀은 거의 전적으로 USDT로 되어 있어 일시적으로 DAI 및 USDC보다 훨씬 저렴합니다. 

- Curve DAI/USDC/USDT 마이닝 풀에 유동성을 계속 추가하려면 UnderlyingBurner 계약 실행() 함수를 호출하세요. UnderlyingBurner는 주로 USDT를 보유하고 있으며, 추가된 DAI:USDC:USDT 수는 100,000:100, 000:227, 079, 039, 776입니다. 이로 인해 USDT의 상대적인 양은 늘어나고 가치는 낮아지는 등 풀의 불균형이 더욱 심화됩니다. 

- 공격자는 자신이 보유하고 있는 DAI 및 USDC를 Curve DAI/USDC/USDT 풀에 추가하고 프리미엄을 누렸습니다. 이는 더 많은 양의 CRV LP 토큰 3개를 획득한다는 의미입니다. 

- 공격자는 CRV LP 토큰 3개를 파괴하고 USDT 유동성을 인출했습니다. 

- 공격자는 플래시 대출금을 상환하고 36.8K USDT의 수익을 유지합니다. 

이 과정에서 악성 거래란 공격자가 Curve DAI/USDC/USDT 마이닝 풀에서 대량의 DAI 및 USDC 유동성을 제거하고 CRV LP 토큰 3개를 파기한 거래를 말합니다. 이 거래로 인해 풀의 균형이 매우 불균형해졌고, USDT의 상대적 금액이 높아져 가치가 낮아졌습니다.
나머지 두 거래는 공격자가 유동성을 추가하고 유동성을 인출한 거래를 말한다. 공격자는 자신이 보유한 DAI 및 USDC 유동성을 Curve DAI/USDC/USDT 마이닝 풀에 추가하고 프리미엄으로 인출하여 더 많은 양의 CRV LP 토큰 3개를 획득함으로써 가격 차이를 이용했습니다.
이 방법으로 공격자는 샌드위치 공격을 통해 악의적인 거래를 다른 두 개의 거래와 패키징하고 USDT 유동성을 저렴한 가격에 구매한 후 높은 가격에 판매하여 수익을 얻습니다.
거래 주문 제한
샌드위치 공격을 방지하려면 코드 구현에 복잡한 스마트 계약 및 트랜잭션 논리가 포함될 수 있습니다. 다음은 통과 방법을 보여주는 간단한 예입니다.거래 순서를 제한하고 거래 지연을 도입합니다.샌드위치 공격을 방지하기 위해

이 예에서는 사용자의 잔액 및 거래 작업을 관리하는 스마트 계약 SandwichAttackPrevention이 있다고 가정합니다. 샌드위치 공격을 방지하기 위해 두 가지 주요 방어 메커니즘을 소개합니다.
먼저, AllowTransaction 함수에서는 계약 소유자만이 isTransactionAllowed를 true로 설정하여 사용자가 트랜잭션을 수행할 수 있도록 할 수 있습니다. 이렇게 하면 트랜잭션이 올바른 순서로 실행되고 공격자가 두 트랜잭션 사이에 악의적인 트랜잭션을 삽입하는 것을 방지할 수 있습니다.
둘째, ExecuteTransaction 함수에서는 트랜잭션 지연이라는 개념을 도입합니다. 사용자는 현재 블록 시간이 설정된 지연 시간을 초과한 후에만 트랜잭션을 실행할 수 있습니다. 이는 다른 사용자에게 거래를 실행하고 가격을 업데이트할 수 있는 충분한 시간을 제공하여 공격자가 가격 차이를 악용할 기회를 줄입니다.
1.3 오라클 공격
가격 오라클은 암호화폐의 실시간 가격 정보를 제공하는 데이터 소스입니다. 이 정보는 많은 DeFi 프로토콜이 제대로 작동하는 데 중요합니다.오라클 공격이란 공격자가 가격 조작을 기반으로 한 거래에서 이익을 얻기 위해 오라클이 제공하는 데이터를 인위적으로 변경하는 것을 말합니다.
로데오파이낸스 오라클 공격 사건
로데오는 가격 오라클 서비스를 제공하는 DeFi 플랫폼입니다. 2023년 7월 11일 가격 오라클 조작으로 인해 해커가 로데오 프로토콜을 훔치는 사건이 발생했습니다.약 472 ETH(약 888,000 USD)입니다.
Attack Tx:
가격 오라클은 어떻게 조작되나요?
로데오파이낸스 공격의 핵심은 로데오 TWAP 오라클이었다. 이 오라클은 ETH와 unshETH 간의 가격 비율을 추적하는 데 사용됩니다.
- 공격 트랜잭션 분석: 공격 프로세스는 공격자가 신중하게 계획된 트랜잭션을 실행하는 것으로 시작됩니다. 공격자들은 플랫폼 아키텍처에 대한 깊은 이해와 TWAP(Time Weighted Average Price) 오라클의 잠재적인 취약점을 활용하여 공격을 시작했습니다. 
- TWAP 오라클 조작: 공격자는 구성되지 않은 정책 주소와 관련된 적립 기능을 사용하여 USDC를 unshETH로 강제로 교환할 수 있습니다. 이 조작은 결함이 있는 unshETH 가격 오라클로 인한 미끄러짐 제어를 효과적으로 우회합니다. 본질적으로 수익 창출 기능은 USDC에서 WETH로, 그리고 unshETH로 강제 전환됩니다. 
- TWAP 가격 계산: TWAP 가격은 각각 45분 간격으로 업데이트된 마지막 4개 업데이트의 가격을 평균하여 계산됩니다. 그러나 결함이 있는 가격 오라클이 조작된 가격을 반환하여 스마트 계약이 해당 위치를 건전한 것으로 간주하게 되었습니다. 
- 레버리지 포지션 열기: 공격자는 샌드위치 공격을 통해 TWAP 오라클을 조작한 다음 투자자 계약에서 수익 창출 기능을 호출하여 레버리지 포지션을 엽니다. 그들은 40만 달러 상당의 USDC를 빌렸습니다. 

- 자산 교환: 공격자는 빌린 자산을 기본 CamelotDEX 풀과 교환하는 동시에 준비된 unshETH를 풀에 다시 판매합니다. 
- 실행 확인 우회: 계약은 종종 작업이 유효한지 확인합니다. 그러나 공격자가 이 전략을 통제했기 때문에 이 검사를 쉽게 우회했습니다. 이를 통해 공격자는 준비된 unshETH를 풀에 다시 판매하여 조작된 위치를 악용하고 플랫폼에서 유동성을 효과적으로 추출할 수 있습니다. 
- 훔친 자금 이체: 공격자는 훔친 자금을 Arbitrum에서 Ethereum으로 옮겨 285 ETH를 unshETH로 교환한 다음 Arbitrum으로 옮겨 공격을 계속했습니다. 150 ETH 상당의 도난당한 자금은 개인정보 보호에 초점을 맞춘 이더리움 혼합 서비스인 Tornado Cash로 이체되었습니다. 나머지 371.2 ETH(약 $701,679 상당)는 여전히 공격자가 제어하는 주소에 보관되어 있습니다. 
이 공격의 중요한 취약점은 Rodeo TWAP Oracle 실행의 결함입니다. 오라클은 유동성이 낮고 따라서 가격 변동이 높은 WETH/unshETH 거래 쌍의 보유고에 의존합니다.
여러 오라클을 기반으로 가격 계산
가격 쿼리의 신뢰성을 보장하려면 신뢰할 수 있는 오라클을 사용해야 합니다.여러 오라클 또는 집계 가격 피드토큰 페어링 비율에만 의존하지 않고 가격을 계산합니다. 특히 채굴 풀 유동성이 낮은 상황에서는 이러한 다양한 가격 정보 소스로 인해 가격 데이터의 정확성이 향상되고 공격자가 데이터를 조작하기가 더 어려워질 수 있습니다.
이를 달성하기 위한 한 가지 가능한 해결책은 Chainlink와 같은 분산형 오라클을 사용하는 것입니다. 체인링크 오라클은 다양한 데이터 소스로부터 데이터를 수집하고 블록체인 기술을 사용하여 데이터의 정확성을 검증하고 확인할 수 있습니다. 체인링크는 여러 데이터 소스를 사용함으로써 단일 실패 지점의 가능성을 줄이고 공격자가 데이터를 조작하기 어렵게 만듭니다.
다음은 가격 데이터를 얻기 위해 Chainlink 애그리게이터 계약을 사용하는 예제 코드입니다.

위 코드에서는 AggregatorV3Interface 유형의 배열을 사용하여 여러 oracle 인스턴스를 저장합니다. 생성자는 oracle 주소 배열을 매개변수로 받아들이고 각 주소를 AggregatorV3Interface 객체로 인스턴스화합니다.
getLatestPrice 함수는 여러 데이터 소스에서 최신 가격 데이터를 얻는 데 사용됩니다. 이는 PriceFeeds 배열을 반복하고 각 오라클의 최신RoundData 함수를 호출하여 가격 데이터를 가져옵니다. 모든 가격 데이터는 int 유형의 배열에 저장되고 호출자에게 반환됩니다.
이러한 방식으로 우리는 여러 데이터 소스에서 가격 데이터를 얻을 수 있으며 가격 쿼리가 자산 가격을 보다 정확하게 반영하도록 할 수 있습니다.
2. 스마트 계약 취약성 위험
스마트 계약 취약점 스마트 계약 취약점은 Ethereum 또는 기타 스마트 계약 플랫폼에 작성된 코드의 보안 허점 또는 버그를 나타냅니다.DeFi의 핵심은 스마트 계약을 기반으로 한 금융 프로토콜이므로 스마트 계약 취약점으로 인해 사용자 자금 손실, 시장 조작 또는 기타 악의적인 행위가 발생할 수 있습니다.
이러한 취약점을 식별하는 것이 중요합니다.우리를감사 범위다양한 잠재적인 문제. 여기에는 재진입 취약성, 액세스 제어 취약성, 정수 오버플로 취약성 및 비즈니스 로직 취약성이 포함되지만 이에 국한되지는 않습니다. 당사의 포괄적인 감사 서비스는 스마트 계약의 보안을 강화하고 이러한 위험으로부터 보호하도록 설계되었습니다.
다음은 스마트 계약 취약성이 DeFi에 미치는 영향을 설명하기 위해 액세스 제어 취약성을 예로 사용합니다.
LeetSwap 접근통제 취약점
LeetSwap이 공격을 받았습니다.손실액이 340ETH를 초과했습니다.. 근본 원인은 LeetSwap V2 쌍 계약에 액세스 제어 취약점이 있고 _transferFeesSupportingTaxTokens 함수의 가시성이 공개되어 있다는 것입니다.
Attack Tx:
Vulnerable Contract:
https://basescan.org/address/0x94dac4a3ce998143aa119c05460731da80ad90cf
 공격자는 Pool을 조작하기 위해 _transferFeesSupportingTaxTokens 함수를 호출하였으며, 공격 과정은 다음과 같다.
공격자는 Pool을 조작하기 위해 _transferFeesSupportingTaxTokens 함수를 호출하였으며, 공격 과정은 다음과 같다.
- WETH를 사용하여 다른 토큰 A로 교환하세요. 
- 토큰 A를 전송하기 위해 _transferFeesSupportingTaxTokens 함수가 호출되고, 이어서 동기화 함수가 호출되어 토큰 A의 가격이 상승하게 됩니다. 
- 토큰 A를 더 많은 WETH로 교환하고 풀을 비우세요. 
해결책
_transferFeesSupportingTaxTokens 함수의 액세스 제어 취약성을 해결하려면 함수 가시성을 비공개 또는 내부로 변경해야 합니다. 계약 내의 다른 함수만 호출할 수 있도록 함수를 비공개로 선언합니다. 이 계약을 상속하는 계약에서 액세스할 수 있도록 함수를 내부로 선언합니다. 다른 계약이 LeetSwap V2 쌍 계약을 상속하는 경우 super 키워드를 통해 _transferFeesSupportingTaxTokens 함수를 호출할 수 있습니다. 외부 사용자는 이 기능에 직접 접근할 수 없으므로 계약의 보안이 향상됩니다.
보안을 향상시키면서 계약의 정상적인 작동에 영향을 미치지 않도록 특정 계약 논리 및 요구 사항을 기반으로 기능의 가시성을 어떻게 변경하는지 결정해야 합니다.
스마트 계약 감사는 취약점을 식별하고 예방하는 중요한 단계입니다. 존재하다Salus,우리는 귀하의 계약 보안을 강화하는 데 도움을 줄 수 있는 숙련된 스마트 계약 개발자 및 감사 전문가로 구성된 팀을 보유하고 있습니다.우리의 전문 지식을 통해 잠재적인 약점을 정확히 찾아내고 프로젝트의 안전과 신뢰성을 보장할 수 있습니다.
3. 사용자 운영 위험
DeFi 분야에서 사용자 운영 리스크란 DeFi 플랫폼 이용 시 사용자 자신의 운영 오류, 보안 인식 부족, 경솔한 행동 등으로 인해 자본 손실이 발생할 수 있는 위험을 의미합니다.다음은 몇 가지 일반적인 사용자 작업 위험입니다.
- 악성 링크 클릭: 사용자가 실수로 악성 링크를 클릭하면 악성 코드나 바이러스가 장치를 감염시킬 수 있으며, 공격자는 이를 이용해 사용자의 민감한 정보에 접근하거나 지갑을 제어할 수 있습니다. 
- 안전하지 않은 지갑 사용: 사용자가 안전하지 않은 지갑 애플리케이션이나 하드웨어 지갑을 사용하기로 선택한 경우 공격자는 이러한 취약점을 악용하여 사용자의 개인 키나 운영 권한을 훔칠 수 있습니다. 
- 개인키 유출: 사용자가 암호화되지 않은 환경에서 개인키를 유출하거나, 개인키를 안전하지 않은 곳에 보관하는 경우, 공격자는 쉽게 사용자의 개인키를 탈취하고 자금을 통제할 수 있습니다. 
- 무분별한 거래 운영: 사용자가 거래 시 거래 세부정보(예: 대상 주소, 거래 금액 등)를 주의 깊게 확인하지 않으면 자금이 잘못된 주소 또는 금액으로 전송될 수 있습니다. 
사용자 운영 위험을 줄이기 위한 몇 가지 제안 사항은 다음과 같습니다.
- 보안 인식 제고: 일반적인 피싱, 맬웨어 및 사기 전술을 이해하고 이를 인식하고 방지하는 방법을 알아봅니다. DeFi 관련 링크와 애플리케이션을 경계하고 주의 깊게 조사하세요. 
- 보안 지갑 사용: 보안 감사를 받고 평판이 좋은 지갑 앱이나 하드웨어 지갑을 사용하도록 선택하세요. 지갑 애플리케이션과 펌웨어가 최신인지 확인하고 최상의 보안 관행을 따르세요. 
- 개인 키 백업 및 보호: 개인 키를 안전한 곳에 보관하고 강력한 비밀번호로 암호화합니다. 우발적인 데이터 손실을 방지하려면 개인 키를 정기적으로 백업하고 오프라인의 안전한 위치에 저장하세요. 
- 거래 내역 다시 확인: 거래를 실행하기 전에 거래 내역을 다시 확인하여 대상 주소, 거래 금액 등이 올바른지 확인하세요. 이중 확인을 통해 부주의로 인한 자금 손실을 방지할 수 있습니다. 
4. 요약
위의 각 공격 및 취약점에 대한 솔루션은 단순한 예시일 뿐 해당 공격을 완전히 예방하거나 해당 취약점을 수정하는 것은 아니라는 점을 참고하시기 바랍니다. 스마트 계약 감사에 관심이 있으시면문의하기, 우리는 귀하와 협력하여 귀하의 계약이 안전하고 신뢰할 수 있도록 전문적인 감사 서비스를 제공할 것입니다. 우리는 귀하의 스마트 계약이 안전하고 신뢰할 수 있는 환경에서 실행될 수 있도록 고품질 서비스와 포괄적인 기술 지원을 제공하기 위해 최선을 다하고 있습니다.


