Description

When a client sends a request with no passphrase to Unreal Remote Control's "/remote/batch" endpoint, and the plugin is configured to not perform passphrase verification, the Editor will crash as soon as the request is received.

The crash happens in file "WebRemoteControl.cpp", function FWebRemoteControlModule::HandleBatchRequest(), line 930. This attempts to access the "Passphrase" header on the request, but it might not exist. Note that this line was added by CL 19263496, which included handling a non-existing passphrase header on multiple code paths, but not on FWebRemoteControlModule::HandleBatchRequest().

The crash only occurs if the plugin is configured to not perform passphrase verification (otherwise it will correctly deny the request before getting to the crash point). This is the case, for example, with the following settings (which can be set on "DefaultRemoteControl.ini" or through the Project Settings):

  • bRestrictServerAccess=False (default)
  • bRestrictServerAccess=True, bEnforcePassphraseForRemoteClients=False
  • bRestrictServerAccess=True, bEnforcePassphraseForRemoteClients=True, but Passphrases array is left empty
Steps to Reproduce

1. Enable plugin "Remote Control API" and restart the Editor

2. Use "curl", "Invoke-RestMethod", Postman or another tool to send a request to the "/remote/batch" endpoint

3. Crash!

PowerShell:

Invoke-RestMethod `

-Uri "http://127.0.0.1`:30010/remote/batch" `

-Method Put `

-Body '

{"Requests": []}

' `

-ContentType "application/json"

curl (Windows):

curl -s -X PUT [Link Removed] ^

-H "Content-Type: application/json" ^

-d "

{\"Requests\": []}

"

curl (Linux):

curl -s -X PUT [Link Removed] \

-H "Content-Type: application/json" \

-d '

{"Requests": []}

'

Callstack

UnrealEditor-WebRemoteControl.dll!TMapBase<FString,TArray<FString,TSizedDefaultAllocator<32>>,FDefaultSetAllocator,TDefaultMapHashableKeyFuncs<FString,TArray<FString,TSizedDefaultAllocator<32>>,0>>::FindChecked(const FString &) Line 635 C++

UnrealEditor-WebRemoteControl.dll!TMap<FString,TArray<FString,TSizedDefaultAllocator<32>>,FDefaultSetAllocator,TDefaultMapHashableKeyFuncs<FString,TArray<FString,TSizedDefaultAllocator<32>>,0>>::operator[](const FString &) Line 1412 C++

UnrealEditor-WebRemoteControl.dll!FWebRemoteControlModule::HandleBatchRequest(const FHttpServerRequest & Request, const TFunction<void __cdecl(TUniquePtr<FHttpServerResponse,TDefaultDelete<FHttpServerResponse>> &&)> & OnComplete) Line 930 C++

UnrealEditor-WebRemoteControl.dll!Invoke(bool(FWebRemoteControlModule::*)(const FHttpServerRequest &, const TFunction<void __cdecl(TUniquePtr<FHttpServerResponse,TDefaultDelete<FHttpServerResponse>> &&)> &)) Line 66 C++

UnrealEditor-WebRemoteControl.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(bool(FWebRemoteControlModule::*)(const FHttpServerRequest &, const TFunction<void __cdecl(TUniquePtr<FHttpServerResponse,TDefaultDelete<FHttpServerResponse>> &&)> &) &) Line 326 C++

UnrealEditor-WebRemoteControl.dll!TBaseRawMethodDelegateInstance<0,FWebRemoteControlModule,bool __cdecl(FHttpServerRequest const &,TFunction<void __cdecl(TUniquePtr<FHttpServerResponse,TDefaultDelete<FHttpServerResponse>> &&)> const &),FDefaultDelegateUserPolicy>::Execute(const FHttpServerRequest & <Params_0>, const TFunction<void __cdecl(TUniquePtr<FHttpServerResponse,TDefaultDelete<FHttpServerResponse>> &&)> & <Params_1>) Line 552 C++

UnrealEditor-HTTPServer.dll!TDelegate<bool __cdecl(FHttpServerRequest const &,TFunction<void __cdecl(TUniquePtr<FHttpServerResponse,TDefaultDelete<FHttpServerResponse>> &&)> const &),FDefaultDelegateUserPolicy>::Execute(const FHttpServerRequest &) Line 614 C++

UnrealEditor-HTTPServer.dll!FHttpConnection::ProcessRequest(const TSharedPtr<FHttpServerRequest,1> & Request, const TFunction<void __cdecl(TUniquePtr<FHttpServerResponse,TDefaultDelete<FHttpServerResponse>> &&)> & OnProcessingComplete) Line 213 C++

UnrealEditor-HTTPServer.dll!FHttpConnection::CompleteRead(const TSharedPtr<FHttpServerRequest,1> & Request) Line 191 C++

UnrealEditor-HTTPServer.dll!FHttpConnection::ContinueRead(float DeltaTime) Line 148 C++

UnrealEditor-HTTPServer.dll!FHttpConnection::BeginRead(float DeltaTime) Line 127 C++

UnrealEditor-HTTPServer.dll!FHttpConnection::Tick(float DeltaTime) Line 54 C++

UnrealEditor-HTTPServer.dll!FHttpListener::TickConnections(float DeltaTime) Line 232 C++

UnrealEditor-HTTPServer.dll!FHttpListener::Tick(float DeltaTime) Line 163 C++

UnrealEditor-HTTPServer.dll!FHttpServerModule::Tick(float DeltaTime) Line 189 C++

UnrealEditor-Core.dll!Invoke(bool(FTSTickerObjectBase::*)(float)) Line 66 C++

UnrealEditor-Core.dll!UE::Core::Private::Tuple::TTupleBase<TIntegerSequence<unsigned int>>::ApplyAfter(bool(FTSTickerObjectBase::*)(float) &) Line 326 C++

UnrealEditor-Core.dll!TBaseRawMethodDelegateInstance<0,FTSTickerObjectBase,bool __cdecl(float),FDefaultDelegateUserPolicy>::Execute(float <Params_0>) Line 552 C++

UnrealEditor-Core.dll!TDelegate<bool __cdecl(float),FDefaultDelegateUserPolicy>::Execute(float) Line 614 C++

UnrealEditor-Core.dll!FTSTicker::FElement::

{ctor}

::_l1::<lambda_28>::operator()(float DeltaTime) Line 166 C++

UnrealEditor-Core.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,bool __cdecl(float)>::operator()(float <Params_0>) Line 414 C++

UnrealEditor-Core.dll!FTSTicker::FElement::Fire(float) Line 179 C++

UnrealEditor-Core.dll!FTSTicker::Tick(float DeltaTime) Line 121 C++

UnrealEditor.exe!FEngineLoop::Tick() Line 6073 C++

UnrealEditor.exe!EngineTick() Line 60 C++

UnrealEditor.exe!GuardedMain(const wchar_t * CmdLine) Line 190 C++

UnrealEditor.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) Line 266 C++

UnrealEditor.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) Line 334 C++

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-370949 in the post.

0
Login to Vote

Backlogged
CreatedMar 20, 2026
UpdatedMar 25, 2026
View Jira Issue