Skip to content

Commit b68da64

Browse files
fix(x/authz,x/feegrant): check blocked address (backport #20102) (#20114)
Co-authored-by: Julien Robert <[email protected]>
1 parent 3d03c1b commit b68da64

File tree

13 files changed

+69
-10
lines changed

13 files changed

+69
-10
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@ Ref: https://keepachangelog.com/en/1.0.0/
3737

3838
## [Unreleased]
3939

40-
## [v0.47.11](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.47.11) - 2024-04-18
40+
## [v0.47.11](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.47.11) - 2024-04-22
4141

4242
### Bug Fixes
4343

44+
* (x/feegrant,x/authz) [#20114](https://github.com/cosmos/cosmos-sdk/pull/20114) Follow up of [GHSA-4j93-fm92-rp4m](https://github.com/cosmos/cosmos-sdk/security/advisories/GHSA-4j93-fm92-rp4m). The same issue was found in `x/feegrant` and `x/authz` modules.
4445
* (crypto) [#20027](https://github.com/cosmos/cosmos-sdk/pull/20027) secp256r1 keys now implement gogoproto's customtype interface.
4546
* (x/gov) [#19725](https://github.com/cosmos/cosmos-sdk/pull/19725) Fetch a failed proposal tally from `proposal.FinalTallyResult` in the gprc query.
4647
* (crypto) [#19691](https://github.com/cosmos/cosmos-sdk/pull/19746) Throw an error when signing with incorrect Ledger.

RELEASE_NOTES.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ For this month patch release of the v0.47.x line, a few bug were fixed in the SD
88
Notably:
99

1010
* `secp256r1` keys now implement gogoproto's customtype interface.
11-
* Throw an error when signing with incorrect Ledger.
11+
* CLI now throws an error when signing with an incorrect Ledger.
12+
* Fixing [GHSA-4j93-fm92-rp4m](https://github.com/cosmos/cosmos-sdk/security/advisories/GHSA-4j93-fm92-rp4m) in `x/feegrant` and `x/authz` modules. The upgrade instuctions were provided in the [v0.47.9 release notes](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.47.9).
1213

1314
Check out the [changelog](https://github.com/cosmos/cosmos-sdk/blob/v0.47.11/CHANGELOG.md) for an exhaustive list of changes or [compare changes](https://github.com/cosmos/cosmos-sdk/compare/v0.47.10...v0.47.11) from last release.
1415

x/authz/expected_keepers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ type AccountKeeper interface {
1616
type BankKeeper interface {
1717
SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
1818
IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error
19+
BlockedAddr(addr sdk.AccAddress) bool
1920
}

x/authz/keeper/keeper.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type Keeper struct {
2828
cdc codec.BinaryCodec
2929
router *baseapp.MsgServiceRouter
3030
authKeeper authz.AccountKeeper
31+
bankKeeper authz.BankKeeper
3132
}
3233

3334
// NewKeeper constructs a message authorization Keeper
@@ -40,6 +41,13 @@ func NewKeeper(storeKey storetypes.StoreKey, cdc codec.BinaryCodec, router *base
4041
}
4142
}
4243

44+
// Super ugly hack to not be breaking in v0.50 and v0.47
45+
// DO NOT USE.
46+
func (k Keeper) SetBankKeeper(bk authz.BankKeeper) Keeper {
47+
k.bankKeeper = bk
48+
return k
49+
}
50+
4351
// Logger returns a module-specific logger.
4452
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
4553
return ctx.Logger().With("module", fmt.Sprintf("x/%s", authz.ModuleName))

x/authz/keeper/keeper_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ func (s *TestSuite) SetupTest() {
6666
s.bankKeeper = authztestutil.NewMockBankKeeper(ctrl)
6767
banktypes.RegisterInterfaces(s.encCfg.InterfaceRegistry)
6868
banktypes.RegisterMsgServer(s.baseApp.MsgServiceRouter(), s.bankKeeper)
69+
s.bankKeeper.EXPECT().BlockedAddr(gomock.Any()).Return(false).AnyTimes()
6970

70-
s.authzKeeper = authzkeeper.NewKeeper(key, s.encCfg.Codec, s.baseApp.MsgServiceRouter(), s.accountKeeper)
71+
s.authzKeeper = authzkeeper.NewKeeper(key, s.encCfg.Codec, s.baseApp.MsgServiceRouter(), s.accountKeeper).SetBankKeeper(s.bankKeeper)
7172

7273
queryHelper := baseapp.NewQueryServerTestHelper(s.ctx, s.encCfg.InterfaceRegistry)
7374
authz.RegisterQueryServer(queryHelper, s.authzKeeper)

x/authz/keeper/msg_server.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ func (k Keeper) Grant(goCtx context.Context, msg *authz.MsgGrant) (*authz.MsgGra
2121
// create the account if it is not in account state
2222
granteeAcc := k.authKeeper.GetAccount(ctx, grantee)
2323
if granteeAcc == nil {
24+
if k.bankKeeper.BlockedAddr(grantee) {
25+
return nil, sdkerrors.ErrUnauthorized.Wrapf("%s is not allowed to receive funds", grantee)
26+
}
27+
2428
granteeAcc = k.authKeeper.NewAccountWithAddress(ctx, grantee)
2529
k.authKeeper.SetAccount(ctx, granteeAcc)
2630
}

x/authz/module/module.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ type AppModule struct {
113113
func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak authz.AccountKeeper, bk authz.BankKeeper, registry cdctypes.InterfaceRegistry) AppModule {
114114
return AppModule{
115115
AppModuleBasic: AppModuleBasic{cdc: cdc},
116-
keeper: keeper,
116+
keeper: keeper.SetBankKeeper(bk), // Super ugly hack to not be api breaking in v0.50 and v0.47,
117117
accountKeeper: ak,
118118
bankKeeper: bk,
119119
registry: registry,

x/authz/testutil/expected_keepers_mocks.go

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x/feegrant/expected_keepers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ type AccountKeeper interface {
1919
type BankKeeper interface {
2020
SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
2121
SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
22+
BlockedAddr(addr sdk.AccAddress) bool
2223
}

x/feegrant/keeper/keeper.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type Keeper struct {
2121
cdc codec.BinaryCodec
2222
storeKey storetypes.StoreKey
2323
authKeeper feegrant.AccountKeeper
24+
bankKeeper feegrant.BankKeeper
2425
}
2526

2627
var _ ante.FeegrantKeeper = &Keeper{}
@@ -34,6 +35,13 @@ func NewKeeper(cdc codec.BinaryCodec, storeKey storetypes.StoreKey, ak feegrant.
3435
}
3536
}
3637

38+
// Super ugly hack to not be breaking in v0.50 and v0.47
39+
// DO NOT USE.
40+
func (k Keeper) SetBankKeeper(bk feegrant.BankKeeper) Keeper {
41+
k.bankKeeper = bk
42+
return k
43+
}
44+
3745
// Logger returns a module-specific logger.
3846
func (k Keeper) Logger(ctx sdk.Context) log.Logger {
3947
return ctx.Logger().With("module", fmt.Sprintf("x/%s", feegrant.ModuleName))
@@ -44,6 +52,10 @@ func (k Keeper) GrantAllowance(ctx sdk.Context, granter, grantee sdk.AccAddress,
4452
// create the account if it is not in account state
4553
granteeAcc := k.authKeeper.GetAccount(ctx, grantee)
4654
if granteeAcc == nil {
55+
if k.bankKeeper.BlockedAddr(grantee) {
56+
return sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to receive funds", grantee)
57+
}
58+
4759
granteeAcc = k.authKeeper.NewAccountWithAddress(ctx, grantee)
4860
k.authKeeper.SetAccount(ctx, granteeAcc)
4961
}

x/feegrant/keeper/keeper_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type KeeperTestSuite struct {
2626
atom sdk.Coins
2727
feegrantKeeper keeper.Keeper
2828
accountKeeper *feegranttestutil.MockAccountKeeper
29+
bankKeeper *feegranttestutil.MockBankKeeper
2930
}
3031

3132
func TestKeeperTestSuite(t *testing.T) {
@@ -41,12 +42,13 @@ func (suite *KeeperTestSuite) SetupTest() {
4142
// setup gomock and initialize some globally expected executions
4243
ctrl := gomock.NewController(suite.T())
4344
suite.accountKeeper = feegranttestutil.NewMockAccountKeeper(ctrl)
44-
suite.accountKeeper.EXPECT().GetAccount(gomock.Any(), suite.addrs[0]).Return(authtypes.NewBaseAccountWithAddress(suite.addrs[0])).AnyTimes()
45-
suite.accountKeeper.EXPECT().GetAccount(gomock.Any(), suite.addrs[1]).Return(authtypes.NewBaseAccountWithAddress(suite.addrs[1])).AnyTimes()
46-
suite.accountKeeper.EXPECT().GetAccount(gomock.Any(), suite.addrs[2]).Return(authtypes.NewBaseAccountWithAddress(suite.addrs[2])).AnyTimes()
47-
suite.accountKeeper.EXPECT().GetAccount(gomock.Any(), suite.addrs[3]).Return(authtypes.NewBaseAccountWithAddress(suite.addrs[3])).AnyTimes()
45+
for i := 0; i < len(suite.addrs); i++ {
46+
suite.accountKeeper.EXPECT().GetAccount(gomock.Any(), suite.addrs[i]).Return(authtypes.NewBaseAccountWithAddress(suite.addrs[i])).AnyTimes()
47+
}
48+
suite.bankKeeper = feegranttestutil.NewMockBankKeeper(ctrl)
49+
suite.bankKeeper.EXPECT().BlockedAddr(gomock.Any()).Return(false).AnyTimes()
4850

49-
suite.feegrantKeeper = keeper.NewKeeper(encCfg.Codec, key, suite.accountKeeper)
51+
suite.feegrantKeeper = keeper.NewKeeper(encCfg.Codec, key, suite.accountKeeper).SetBankKeeper(suite.bankKeeper)
5052
suite.ctx = testCtx.Ctx
5153
suite.msgSrvr = keeper.NewMsgServerImpl(suite.feegrantKeeper)
5254
suite.atom = sdk.NewCoins(sdk.NewCoin("atom", sdk.NewInt(555)))

x/feegrant/module/module.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ type AppModule struct {
121121
func NewAppModule(cdc codec.Codec, ak feegrant.AccountKeeper, bk feegrant.BankKeeper, keeper keeper.Keeper, registry cdctypes.InterfaceRegistry) AppModule {
122122
return AppModule{
123123
AppModuleBasic: AppModuleBasic{cdc: cdc},
124-
keeper: keeper,
124+
keeper: keeper.SetBankKeeper(bk), // Super ugly hack to not be api breaking in v0.50 and v0.47,
125125
accountKeeper: ak,
126126
bankKeeper: bk,
127127
registry: registry,

x/feegrant/testutil/expected_keepers_mocks.go

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)