Skip to content

Commit

Permalink
Problem: missing validation on nft-transfer message fields
Browse files Browse the repository at this point in the history
Solution:
- add some validation in check-tx first
  • Loading branch information
yihuang committed Dec 5, 2023
1 parent d71c53c commit 3465044
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
- [#1004](https://github.com/crypto-org-chain/chain-main/pull/1004) Update rocksdb dependency to 8.1.1.
- [#1009](https://github.com/crypto-org-chain/chain-main/pull/1009) Update memiavl to c575f4797ca4, update cosmos-sdk to v0.46.15.
- [#1010](https://github.com/crypto-org-chain/chain-main/pull/1010) Bump librocksdb to 8.5.3
- [#]() Limit the length of NFTTransfer fields.

### Bug Fixes

Expand Down
51 changes: 51 additions & 0 deletions app/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/cosmos/cosmos-sdk/x/auth/ante"
ibcante "github.com/cosmos/ibc-go/v5/modules/core/ante"
"github.com/cosmos/ibc-go/v5/modules/core/keeper"
nfttypes "github.com/crypto-org-chain/chain-main/v4/x/nft-transfer/types"
)

// HandlerOptions extend the SDK's AnteHandler options by requiring the IBC
Expand Down Expand Up @@ -39,6 +40,7 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {
ante.NewValidateBasicDecorator(),
ante.NewTxTimeoutHeightDecorator(),
ante.NewValidateMemoDecorator(options.AccountKeeper),
NewValidateMsgTransferDecorator(),
ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper),
ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker),
// SetPubKeyDecorator must be called before all signature verification decorators
Expand All @@ -52,3 +54,52 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {

return sdk.ChainAnteDecorators(anteDecorators...), nil
}

const (
// values chosen arbitrarily
MaxClassIDLength = 256
MaxTokenIds = 256
MaxTokenIDLength = 256
MaximumReceiverLength = 2048
)

// ValidateMsgTransferDecorator is a temporary decorator that limit the field length of MsgTransfer message.
type ValidateMsgTransferDecorator struct{}

func NewValidateMsgTransferDecorator() ValidateMsgTransferDecorator {
return ValidateMsgTransferDecorator{}
}

func (vtd ValidateMsgTransferDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler) (sdk.Context, error) {
if !ctx.IsCheckTx() {
return next(ctx, tx, simulate)
}

msgs := tx.GetMsgs()
for _, msg := range msgs {
transfer, ok := msg.(*nfttypes.MsgTransfer)
if !ok {
continue
}

if len(transfer.ClassId) > MaxClassIDLength {
return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "class id length must be less than %d", MaxClassIDLength)

Check failure on line 86 in app/ante.go

View workflow job for this annotation

GitHub Actions / golangci-lint

SA1019: sdkerrors.Wrapf is deprecated: functionality of this package has been moved to it's own module: (staticcheck)
}

Check warning on line 87 in app/ante.go

View check run for this annotation

Codecov / codecov/patch

app/ante.go#L86-L87

Added lines #L86 - L87 were not covered by tests

if len(transfer.TokenIds) > MaxClassIDLength {
return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "token id length must be less than %d", MaxClassIDLength)

Check failure on line 90 in app/ante.go

View workflow job for this annotation

GitHub Actions / golangci-lint

SA1019: sdkerrors.Wrapf is deprecated: functionality of this package has been moved to it's own module: (staticcheck)
}

Check warning on line 91 in app/ante.go

View check run for this annotation

Codecov / codecov/patch

app/ante.go#L90-L91

Added lines #L90 - L91 were not covered by tests

for _, tokenID := range transfer.TokenIds {
if len(tokenID) > MaxTokenIDLength {
return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "token id length must be less than %d", MaxTokenIDLength)

Check failure on line 95 in app/ante.go

View workflow job for this annotation

GitHub Actions / golangci-lint

SA1019: sdkerrors.Wrapf is deprecated: functionality of this package has been moved to it's own module: (staticcheck)
}

Check warning on line 96 in app/ante.go

View check run for this annotation

Codecov / codecov/patch

app/ante.go#L95-L96

Added lines #L95 - L96 were not covered by tests
}

if len(transfer.Receiver) > MaximumReceiverLength {
return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "receiver length must be less than %d", MaximumReceiverLength)
}

Check warning on line 101 in app/ante.go

View check run for this annotation

Codecov / codecov/patch

app/ante.go#L100-L101

Added lines #L100 - L101 were not covered by tests
}

return next(ctx, tx, simulate)
}

0 comments on commit 3465044

Please sign in to comment.