26-9-3 SVM 업그래이드 공고가 올라왔습니다.
SVM 업그레이드 공고가 올라왔습니다
여러가지 문제에 대한 대응과 작업이 필요한 모양입니다.
그래도 이렇게 개선작업이 계속되는 것이 매우 긍정적인 모습이 아닌가 합니다.
Know SVM Upgrade V0.0.4
https://steemit.com/svm-evm-on-steem/@blaze.apps/know-svm-upgrade-v0-0-4-mtf9py11
아래는 한글 번역입니다.
[긴급] SVM v0.0.4 기술 심층 분석 및 검증인(Validator) 가이드
안녕하세요 여러분,
본 게시글은 v0.0.4 업그레이드가 실제로 변경하는 내용, 업데이트의 긴급성, 그리고 검증인들이 따라야 할 정확한 실행 절차를 다루는 종합 기술 심층 가이드입니다.
SVM 검증인을 운영 중이시라면 본 문서를 주의 깊게 읽어주시기 바랍니다. 이번 업그레이드는 상태 변경을 동반하는 네트워크 조율형(coordinated) 업그레이드입니다. 개별적으로 임의의 시점에 업데이트하는 것은 안전하지 않습니다.
업그레이드 개요 및 긴급성
최근 Cosmos Labs는 심각한 보안 취약점을 공개했습니다. v0.6.2 또는 v0.7.2 미만 버전의 cosmos/evm을 실행하는 모든 체인은 즉시 업그레이드를 진행해야 합니다.
- 취약점 상세: EVM
StateDB.SubBalance에서 발생하는 잔액 언더플로우(balance underflow) 버그입니다. 트랜잭션이 계정 잔액보다 큰 금액을 차감하려고 할 때 오류를 반환하지 않고~2^256으로 언더플로우(수치가 거꾸로 감김)가 발생합니다. - 실제 피해 사례: 2026년 8월 20일~22일 사이에 MANTRA, TAC, KiiChain 등에서 잔액 수정 프리컴파일(precompile)을 호출하는 특수 조작된 베스팅 계정 스마트 계약을 통해 자금 탈취 공격이 이미 발생했습니다.
- 영향 범위: 공통
cmn.BalanceHandler코드 경로가 계정 잔액을 다루는 모든 프리컴파일(staking, distribution, bank, ics20, gov 및 SVM 자체steembridge BridgeOut)에서 공유되기 때문에, 어떤 사용자든 악의적으로 제작된 트랜잭션을 통해 이 공격을 수행할 수 있습니다. (악의적인 검증인이 필요하지 않음)
SVM은 취약점이 있는 cosmos/evm v0.7.1에 고정되어 있었습니다. 따라서 네트워크 보안을 확보하기 위해 다음 세 가지 핵심 변경 사항을 하나의 조율된 이벤트로 묶어 제공합니다.
cosmos/evm v0.7.1→v0.7.2: 언더플로우 패치 적용(SubBalance가 언더플로우 발생 시 수치가 감기는 대신 패닉을 발생시킴),ParseAmount수정,feemarket가스 오버플로우 제한,app/evm.go에ProcessProposal핸들러 미러링.cosmos-sdk v0.54.3→v0.54.4: 업스트림 별도 보안 릴리스. Cosmos Labs는 모든 체인이 조율된 이벤트를 통해 업그레이드할 것을 권장하며, 두 번의 업그레이드를 피하기 위해 여기에 번들로 포함했습니다.- 출금 지급(Withdrawal-Payout) 검증 강화: 기존
MsgAttestWithdrawalPayout은 검증인 간에 (steem_txid,op_index) 항목만 상호 검증했을 뿐, Steem 상에서 실제 지급된 수량이나 자산 종류를 검증하지 않았습니다. 이로 인해 수동으로 지급을 중계하는 검증인이 잘못된 자산이나 수량을 전송하더라도 유효한 지급으로 승인될 수 있었습니다. 이제 키퍼(Keeper)가 검증인이 보고한amount_millisteem및asset을 출금 기록과 직접 비교하여 일치하지 않을 경우 거부(안전한 무효 처리, 승인 미기록, 감시 이벤트 발행)합니다.
변경 사항 상세 (코드 리뷰어용)
코드 차이점(diff)을 검토하는 분들을 위해 세부 수정 내역을 정리했습니다.
go.mod/go.sum: 상기 언급된 두 가지 버전 업그레이드.app/upgrades.go: 기존 (비활성) v0.0.3 옆에 새로운UpgradeNameV004 = "v0.0.4"핸들러 추가. 의존성 버그 수정이나 지급 검증 변경 사항 모두 새로운 저장소 키(store key)를 추가하지 않으므로 데이터베이스 마이그레이션은 필요하지 않습니다.app/evm.go: 기존SetPrepareProposal과 함께SetProcessProposal연결.app/ante_steembridge.go:v0.7.2기준 업스트림ante/cosmos.go와 다시 비교 검증 완료. (변경 사항 없음)Makefile:VERSION을v0.0.3-Beta-2에서0.0.4로 변경(앞의v제거). 이는 기존에 발견되지 않았던 버그를 해결합니다.docker-entrypoint.sh는cosmovisor/upgrades/v$(steemvmd version)/bin/경로에 업그레이드 바이너리를 배치하며 자체적으로v를 붙입니다. 기존처럼 버전 명칭에 이미v가 포함되어 있으면vv0.0.4같은 형태가 되어 온체인Plan.Name과 일치하지 않는 문제가 있었습니다. 임시 컨테이너 데브넷 부팅 테스트를 통해steemvmd version이0.0.4로 정상 출력되고cosmovisor/upgrades/v0.0.4/bin/steemvmd경로에 올바르게 배치됨을 확인했습니다.precompiles/steembridge/steembridge.go:BridgeOut이 패치된 코드 경로에 함께 노출된다는 내용의 주석 문서 추가.proto/steemvm/steembridge/v1/tx.proto&x/oracle/bridge/types/tx.pb.go:MsgAttestWithdrawalPayout에 새로운amount_millisteem(필드 7) 및asset(필드 8) 필드 추가.x/oracle/bridge/keeper/msg_server_attest_withdrawal_payout.go: 수량/자산 검증 로직 추가 및 수수료 면제 데코레이터 검증 수락 로직 반영.- 이벤트 업데이트: 출금/입금 생성/민팅/소각 이벤트에 새로운
asset속성 추가 및withdrawal_payout_asset_mismatch감시 이벤트 추가. - 오라클 클라이언트 (
oracle/go/,oracle/python/,oracle/js/): 3개 언어 클라이언트 모두 동시 업데이트 완료. 지급 감지 로직이 Steem 전송 작업에서 실제로 관찰된 수량/자산을 파싱하여 보고합니다. 기대값을 그대로 반환하면 온체인 검증의 의미가 사라지므로 절대로 예상값을 되돌려주지 않습니다. (oracle/PROTOCOL.md§5 규격 참조) - 검증:
go build,go vet,go test ./...모두 통과. 실제 데브넷 부팅에서 패닉 없이 블록이 정상 생성됨을 확인했습니다. 3개 오라클 클라이언트 모두 빌드, 타입 체크, 테스트 수트 통과 완료.
보완 예정 검증 작업
최종 검증 완료 전 진행 중인 작업: 실제 익스플로잇 재현 테스트. EVM을 통해 베스팅 계정 계약을 배포하고, 프리컴파일을 통해 언더플로우를 유발하여 업그레이드 후 노드 다운 없이 깔끔하게 거부되는지 확인하는 작업입니다. 현재 이를 위한 EVM/Solidity 도구를 설정 중이며, 업그레이드는 Cosmos Labs의 패치 검증을 바탕으로 진행되지만 해당 로컬 테스트 결과도 곧 공유될 예정입니다.
검증인 업그레이드 지침
방법 A: Docker Compose + Cosmovisor (권장)
Cosmovisor는 업그레이드 높이(Block Height)에 도달하면 바이너리를 자동으로 교체하지만, 업그레이드 높이 도달 전에 새 바이너리가 미리 스테이징(staged)되어 있어야만 작동합니다.
⚠️ 중요 경고: 업그레이드 블록 높이에 도달하기 전에 기존 실행 중인 검증인 노드에서
docker compose down및docker compose up -d --build를 절대 실행하지 마십시오.
docker-entrypoint.sh는cosmovisor/current가 여전히 제네시스(genesis)를 가리키고 있을 경우, 컨테이너가 시작될 때마다cosmovisor/genesis/bin/을 갱신합니다. 실행 중인 컨테이너를 v0.0.4 이미지로 일찍 재시작하면 v0.0.4 바이너리가 제네시스 바이너리로 승격되어 Cosmovisor가 다른 검증인들보다 먼저 v0.0.4를 실행하게 됩니다. 이는 AppHash 불일치를 일으키는 위험한 행동입니다.
대신, 실행 중인 컨테이너 건드리지 않고 일회성 서비스 명령어로 바이너리를 사전 스테이징하세요.
- 브랜치를 가져옵니다 (이 단계에서는 실행 중인 노드를 재빌드하거나 재시작할 필요가 없습니다).
git pull && git checkout release/v0.0.4-security-upgrade
docker compose --profile stage run --rm stage-v0.0.4
이 명령은 배포된 이미지를 가져와 바이너리를 cosmovisor/upgrades/v0.0.4/bin/steemvmd로 직접 복사한 뒤 종료됩니다. cosmovisor/genesis/bin에는 영향을 주지 않으며 Cosmovisor를 실행하지도 않으므로, 기존 노드는 방해받지 않고 작동을 유지합니다.
steemvm-node컨테이너 내에서 바이너리가 제대로 스테이징되었는지 확인합니다.
docker exec steemvm-node ls /root/.steemvm/cosmovisor/upgrades/v0.0.4/bin/
# 출력 결과에 steemvmd 가 포함되어야 함
docker exec steemvm-node /root/.steemvm/cosmovisor/upgrades/v0.0.4/bin/steemvmd version
# 출력 결과: 0.0.4
목표 블록 높이에 도달하기 훨씬 전에 이 작업을 완료하세요. 해당 높이에 도달했을 때 바이너리가 준비되어 있지 않으면 노드가 정지합니다.
- 지정된 업그레이드 높이에 도달하면 Cosmovisor가 이전 프로세스를 중단하고
current포인터를cosmovisor/upgrades/v0.0.4/로 전환한 뒤 자동으로 재시작합니다. 로그를 모니터링하여 정상 작동 여부를 확인하세요.
docker compose logs -f steemvm-node
- 백업 관련 참고: 자동 백업은 비활성화되어 있습니다 (
UNSAFE_SKIP_BACKUP: "true"). 복구용 스냅샷이 필요한 경우 업그레이드 높이 전에 데이터 디렉터리를 수동으로 백업해 두시기 바랍니다. - 노드가 정상적으로 스왑되어 작동하는 것을 확인한 후에만 최신 이미지로 컨테이너를 업데이트하세요. 이때는
cosmovisor/current가upgrades/v0.0.4를 가리키므로 제네시스 갱신 문제가 발생하지 않습니다.
docker compose pull steemvm-node && docker compose up -d steemvm-node
방법 B: Bare steemvmd 바이너리 직접 실행 (Docker 미사용)
Docker를 사용하지 않더라도 Cosmovisor를 형제 바이너리로 설치하여 자동 스왑 기능을 이용하는 것이 권장됩니다.
- Cosmovisor 설치:
GOTOOLCHAIN=go1.25.10 go install cosmossdk.io/tools/cosmovisor/cmd/[email protected]
- 필수 환경 변수 설정 (셸 프로필 또는 systemd 파일에 설정):
export DAEMON_HOME=<기존 노드 home 경로, 예: $HOME/.steemvm>
export DAEMON_NAME=steemvmd
export DAEMON_RESTART_AFTER_UPGRADE=true
export DAEMON_ALLOW_DOWNLOAD_BINARIES=false
export UNSAFE_SKIP_BACKUP=true
- Cosmovisor의
genesis/bin이 현재 실행 중인(업그레이드 전) 바이너리를 가리키도록 초기화합니다.
which steemvmd
cosmovisor init /path/to/your/CURRENTLY-RUNNING/steemvmd
- 새 바이너리를 별도의 디렉터리에서 빌드한 후 업그레이드 슬롯으로 복사합니다.
git pull && git checkout release/v0.0.4-security-upgrade
make install
NEWBIN="$(go env GOBIN)"; [ -z "$NEWBIN" ] && NEWBIN="$(go env GOPATH)/bin"
"$NEWBIN/steemvmd" version # 0.0.4 출력 확인
mkdir -p "$DAEMON_HOME/cosmovisor/upgrades/v0.0.4/bin"
cp "$NEWBIN/steemvmd" "$DAEMON_HOME/cosmovisor/upgrades/v0.0.4/bin/steemvmd"
- 서비스 관리자(systemd ExecStart 등)의 실행 명령어를
steemvmd start ...에서cosmovisor run start ...로 변경하고 1회 재시작합니다. - 목표 높이에 도달하면 Cosmovisor가 v0.0.4 바이너리로 자동 교체하여 재시작합니다.
(참고: Cosmovisor를 사용하지 않는 경우, 업그레이드 높이에 맞춰 수동으로 프로세스를 정지하고 바이너리를 교체해야 하므로 권장하지 않습니다.)
거버넌스 제안 (투표 필요)
본 업그레이드는 Cosmos-SDK 소프트웨어 업그레이드 거버넌스 절차를 따릅니다. 해당 제안에는 name = "v0.0.4" 및 목표 블록 높이가 포함된 x/upgrade Plan이 포함되어 있습니다.
제안 2(Proposal 2)가 현재 라이브 상태이며 투표 진행 중입니다. 중요한 보안 패치인 만큼 모든 검증인의 신속한 투표 참여가 필요합니다.
투표 방법 (Docker / Cosmovisor)
다음 명령어를 실행하여 찬성(yes) 투표를 행사하세요. <your_moniker> 부분을 본인의 검증인 모니커/지갑 이름으로 변경해야 합니다.
docker exec steemvm-node /root/go/bin/steemvmd tx gov vote 2 yes \
--from <your_moniker> \
--home /root/.steemvm \
--chain-id steemvm \
--gas auto \
--gas-adjustment 1.5 \
--gas-prices 1000000000asteem \
-y
(예시: 모니커가 blaze.apps인 경우 <your_moniker> 대신 blaze.apps 입력)
업그레이드 후 정상 작동 확인 (모든 운용자 대상)
업그레이드 블록 높이가 지난 후, 다음 명령어를 통해 노드가 정상 작동하는지 확인하세요.
# 1. 노드가 동기화 중(catching up) 상태가 아닌지 확인
docker exec steemvm-node /root/go/bin/steemvmd status | grep catching_up
# 결과값: false 가 나와야 함
# 2. 지정된 높이에서 업그레이드가 정상 적용되었는지 확인
docker exec steemvm-node /root/go/bin/steemvmd query upgrade applied v0.0.4 --home /root/.steemvm
# 업그레이드가 적용된 정확한 블록 높이가 출력되어야 함
중요한 보안 유지보수에 신속하게 협조해 주시는 모든 검증인분들께 감사드립니다. 여러분의 노력이 SVM 생태계를 더욱 안전하고 견고하게 만듭니다.
High-Yield Curation by @steem-seven
Your content has been supported!
Maximize your passive income!
Delegate your SP to us and earn high rewards
Click here to see our Tiered Reward System
We are the hope!
This post has been upvoted by @italygame witness curation trail
If you like our work and want to support us, please consider to approve our witness
Come and visit Italy Community
안녕하세요, @steem-agora님.
STEEMIT의 일상을 웹툰으로 연결하는 AI 스토리텔링 프로젝트, STEEMTOON입니다.
공개해 주신 이 글의 주제와 경험에서 영감을 받아 《오늘의 스팀마을》 웹툰 소재로 새롭게 각색해 소개했습니다.
원문의 문장과 이미지는 그대로 사용하지 않았으며, 작성자 계정과 원문 링크를 출처로 표시했습니다. 좋은 이야기를 나눠주신 데 대한 감사의 뜻으로 @toononsteem 계정에서 100% 보팅합니다.
소재 활용을 원하지 않으시거나 수정이 필요한 부분이 있다면 이 댓글에 말씀해 주세요. 확인 후 가능한 범위에서 반영하며, 원하실 경우 이후 선정 대상에서도 제외하겠습니다.
소중한 이야기를 공유해 주셔서 감사합니다.
(html comment removed: steem-village-source-comment:v1 )