Skip to content

Commit a67dae7

Browse files
committed
Enforce permission less permissive than default
1 parent c2ec909 commit a67dae7

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

x/wasm/keeper/keeper.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,15 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte,
159159
if !authZ.CanCreateCode(k.getUploadAccessConfig(ctx), creator) {
160160
return 0, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "can not create code")
161161
}
162+
// figure out proper instantiate access
163+
defaultAccessConfig := k.getInstantiateAccessConfig(ctx).With(creator)
164+
if instantiateAccess == nil {
165+
instantiateAccess = &defaultAccessConfig
166+
} else if !instantiateAccess.IsSubset(defaultAccessConfig) {
167+
// we enforce this must be subset of default upload access
168+
return 0, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "instantiate access must be subset of default upload access")
169+
}
170+
162171
wasmCode, err = ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize))
163172
if err != nil {
164173
return 0, sdkerrors.Wrap(types.ErrCreateFailed, err.Error())
@@ -175,10 +184,6 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte,
175184
}
176185
codeID = k.autoIncrementID(ctx, types.KeyLastCodeID)
177186
k.Logger(ctx).Debug("storing new contract", "features", report.RequiredFeatures, "code_id", codeID)
178-
if instantiateAccess == nil {
179-
defaultAccessConfig := k.getInstantiateAccessConfig(ctx).With(creator)
180-
instantiateAccess = &defaultAccessConfig
181-
}
182187
codeInfo := types.NewCodeInfo(checksum, creator, *instantiateAccess)
183188
k.storeCodeInfo(ctx, codeID, codeInfo)
184189

x/wasm/keeper/keeper_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,62 @@ func TestCreateWithParamPermissions(t *testing.T) {
183183
}
184184
}
185185

186+
// ensure that the user cannot set the code instantiate permission to something more permissive
187+
// than the default
188+
func TestEnforceValidPermissionsOnCreate(t *testing.T) {
189+
ctx, keepers := CreateTestInput(t, false, SupportedFeatures)
190+
keeper := keepers.WasmKeeper
191+
contractKeeper := keepers.ContractKeeper
192+
193+
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
194+
creator := keepers.Faucet.NewFundedAccount(ctx, deposit...)
195+
196+
onlyCreator := types.AccessTypeOnlyAddress.With(creator)
197+
198+
specs := map[string]struct {
199+
defaultPermssion types.AccessType
200+
requestedPermission *types.AccessConfig
201+
// grantedPermission is set iff no error
202+
grantedPermission types.AccessConfig
203+
// expError is nil iff the request is allowed
204+
expError *sdkerrors.Error
205+
}{
206+
"override everybody": {
207+
defaultPermssion: types.AccessTypeEverybody,
208+
requestedPermission: &onlyCreator,
209+
grantedPermission: onlyCreator,
210+
},
211+
"default to everybody": {
212+
defaultPermssion: types.AccessTypeEverybody,
213+
requestedPermission: nil,
214+
grantedPermission: types.AccessConfig{Permission: types.AccessTypeEverybody},
215+
},
216+
"cannot override nobody": {
217+
defaultPermssion: types.AccessTypeNobody,
218+
requestedPermission: &onlyCreator,
219+
expError: sdkerrors.ErrUnauthorized,
220+
},
221+
"default to nobody": {
222+
defaultPermssion: types.AccessTypeNobody,
223+
requestedPermission: nil,
224+
grantedPermission: types.AccessConfig{Permission: types.AccessTypeNobody},
225+
},
226+
}
227+
for msg, spec := range specs {
228+
t.Run(msg, func(t *testing.T) {
229+
params := types.DefaultParams()
230+
params.InstantiateDefaultPermission = spec.defaultPermssion
231+
keeper.SetParams(ctx, params)
232+
codeID, err := contractKeeper.Create(ctx, creator, hackatomWasm, spec.requestedPermission)
233+
require.True(t, spec.expError.Is(err), err)
234+
if spec.expError == nil {
235+
codeInfo := keeper.GetCodeInfo(ctx, codeID)
236+
require.Equal(t, codeInfo.InstantiateConfig, spec.grantedPermission)
237+
}
238+
})
239+
}
240+
}
241+
186242
func TestCreateDuplicate(t *testing.T) {
187243
ctx, keepers := CreateTestInput(t, false, SupportedFeatures)
188244
keeper := keepers.ContractKeeper

0 commit comments

Comments
 (0)