You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Then call doAfterVmCallActions again, that is, the function is re-entered, and the functions in after_vm_call_actions_ left in the onRequestHeaders stage will be executed in the onResonseHeaders stage, which may cause unexpected problems.
The following code compiled to wasm crashes Envoy:
ResumeHttpRequest will call continueStream and add the decoder_callbacks_->continueDecoding() function to after_vm_call_actions_, which will be executed during the onResonseHeaders stage triggered by sendLocalReply.
I agree that under no circumstances Wasm should be able to crash the host, so this is definitely a serious issues, but I don't think it's caused by addAfterVmCallAction itself.
There are at least two issues here:
I think SendHttpResponse should be a "final" call, so no Wasm code after it should be executed, definitely not ResumeHttpRequest. envoyproxy/envoy@ff49762 fixed this for double SendHttpResponse, but I think it was a very localized fix.
Calling onResponse{Headers,Body,Trailers} callbacks for a response generated in the same Proxy-Wasm plugin via SendHttpResponse doesn't make any sense. This is how Envoy works, but it's been annoying me for a while, and we should probably add a guard that prevents this from happening.
Unfortunately, both of those are breaking changes (although, the first one shouldn't be noticeable), but we should address them sooner than later.
@PiotrSikora Maybe we should add the stage of the function in addAfterVmCallAction and check whether the stage of executing the function is consistent with the current stage in doAfterVmCallActions, so that the function escape can be avoided.
addAfterVmCallAction
anddoAfterVmCallActions
are used by the context to execute functions after vm calls, such asonRequestHeaders
:proxy-wasm-cpp-host/src/context.cc
Lines 312 to 324 in 72ce32f
If
sendLocalReply
has been added toafter_vm_call_actions_
viaaddAfterVmCallAction
:https://github.com/envoyproxy/envoy/blob/main/source/extensions/common/wasm/context.cc#L1635-L1645
Here
f()
will executesendLocalReply
:proxy-wasm-cpp-host/include/proxy-wasm/wasm.h
Line 154 in 72ce32f
It will call encodeHeaders() which triggers the vm to call
onResponseHeaders
as follows:proxy-wasm-cpp-host/src/context.cc
Lines 374 to 384 in 72ce32f
Then call
doAfterVmCallActions
again, that is, the function is re-entered, and the functions inafter_vm_call_actions_
left in theonRequestHeaders
stage will be executed in theonResonseHeaders
stage, which may cause unexpected problems.The following code compiled to wasm crashes Envoy:
ResumeHttpRequest
will callcontinueStream
and add thedecoder_callbacks_->continueDecoding()
function toafter_vm_call_actions_
, which will be executed during theonResonseHeaders
stage triggered bysendLocalReply
.https://github.com/envoyproxy/envoy/blob/a77335a730f567502721319b20c4b0fab10e09bc/source/extensions/common/wasm/context.cc#L1497-L1501
This resolved issue was also caused by this mechanism.
The text was updated successfully, but these errors were encountered: