-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[CRE-40] Check binary size before decompression #994
Conversation
pkg/workflows/wasm/host/module.go
Outdated
@@ -91,6 +92,7 @@ type ModuleConfig struct { | |||
IsUncompressed bool | |||
Fetch func(ctx context.Context, req *wasmpb.FetchRequest) (*wasmpb.FetchResponse, error) | |||
MaxFetchRequests int | |||
MaxBinarySize int64 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@agparadiso Could we call this MaxUncompressedBinarySize -- since you're only applying it to the uncompressed size
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is used to check the size before decompressing it. Should it be MaxCompressedBinarySize
? 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hah yes it should be :)
pkg/workflows/wasm/host/module.go
Outdated
@@ -183,6 +189,12 @@ func NewModule(modCfg *ModuleConfig, binary []byte, opts ...func(*ModuleConfig)) | |||
|
|||
engine := wasmtime.NewEngineWithConfig(cfg) | |||
if !modCfg.IsUncompressed { | |||
// validate the binary size before decompressing | |||
// this is to prevent decompression bombs | |||
if int64(len(binary)) > modCfg.MaxBinarySize { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this type be uint64
pkg/workflows/wasm/host/module.go
Outdated
@@ -91,6 +92,7 @@ type ModuleConfig struct { | |||
IsUncompressed bool | |||
Fetch func(ctx context.Context, req *wasmpb.FetchRequest) (*wasmpb.FetchResponse, error) | |||
MaxFetchRequests int | |||
MaxBinarySize int64 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
uint64
pkg/workflows/wasm/host/wasm_test.go
Outdated
|
||
t.Run("compressed binary size is bigger than the default 10mb limit", func(t *testing.T) { | ||
// 11mb binary | ||
binary := make([]byte, 11*1024*1024) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
binary := make([]byte, 11*1024*1024) | |
binary := make([]byte, defaultBinarySize + 1) |
nit
maybe simpler to keep the test in sync if this default ever changes
pkg/workflows/wasm/host/wasm_test.go
Outdated
require.NoError(t, bwr.Close()) | ||
|
||
_, err = NewModule(&ModuleConfig{IsUncompressed: false, Logger: logger.Test(t)}, binary) | ||
default10mbLimit := fmt.Sprintf("binary size exceeds the maximum allowed size of %d bytes", 10*1024*1024) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
default10mbLimit := fmt.Sprintf("binary size exceeds the maximum allowed size of %d bytes", 10*1024*1024) | |
default10mbLimit := fmt.Sprintf("binary size exceeds the maximum allowed size of %d bytes", defaultMaxCompressedBinarySize) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ahh true, sorry forgot about that one. should be good now thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit fix test output
c6327cd
to
82d5beb
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🐛 💣
Description
This pr addresses decompression bombs by having a customisable
MaxBinarySize
that we will check before trying to decompress it. By default a 10mb default value is provided.CRE-40
Requires
Supports