All systems operationalSystems operational
Swiss Cloud Düdingen · 99.995% SLAMon to Fri 08:30 to 17:30+41 21 552 03 25
Security Research Technical Paper CVE-2026-104809 High · CVSS 8.4

Mitel MiVoice Office 400: Shared Object Hijacking Leading to Arbitrary Code Execution

Technical analysis and runtime reconstruction of a 32-bit ELF shared library in the MSRV environment, from static reverse engineering to a validated proof of compromise.

ResearcherDigitalCanion SA · Security Research
Published5 October 2026
CVE IDCVE-2026-104809
SeverityHigh · CVSS 8.4
Affected productMitel MiVoice Office 400
ArchitectureEmbedded Linux · ELF32 · i386
Proof of compromise

Watch the full hijack, from boot to root

For the sake of transparency, we recorded the complete hijacking process, from system startup to full compromise. Skip to 5:20 where the hijack begins, then watch the compromise complete after the virtual machine reboots.

hijack_so_file.webm · Shared object hijacking of libXfTftpd.so in the MSRV process · DigitalCanion SA

Navigate this paper
01 / Vulnerability overview

Overview

A shared object hijacking vulnerability exists in Mitel MiVoice Office 400, potentially allowing an attacker with authenticated administrative access to the web management interface to execute arbitrary code as root on the underlying Linux operating system. The vulnerability originates from insufficient access controls in the application's web-based file management functionality, which may allow users to modify files in directories containing executable binaries and shared libraries (.so). By influencing the files loaded by a privileged process, an attacker may escalate privileges from web interface administration to root-level access on the underlying system.

In an email dated September 14, 2026, at 18:08, Mitel's Product Security Incident Response Team (PSIRT) declined remediation, arguing that exploitation requires authenticated administrative access and that administrators are already authorized to upload, modify, and manage files. However, this reasoning does not address the fundamental security issue: authorization to administer an application does not inherently justify unrestricted access to operating system directories or the ability to modify executable components loaded by privileged processes. The issue is not simply that an administrator can manage files, but that the application's file management functionality may expose filesystem locations that should not be writable through the web interface. By treating the authentication requirement as sufficient justification, Mitel's response fails to address the privilege boundary that the vulnerability potentially compromises.

As of the publication of this report, no security patch has been made available, and Mitel's PSIRT has indicated that it does not intend to remediate the reported behavior. Organizations operating affected systems should therefore implement compensating security measures.

The primary recommendation is to restrict access to the MiVoice Office 400 management interface to trusted personnel with explicit IT infrastructure or security administration responsibilities. Organizations should additionally isolate the management interface on a restricted network, review administrative accounts, and monitor access to the system.

These measures do not eliminate the underlying vulnerability. Until an effective remediation becomes available, restricting access to the management interface is the principal recommended mitigation.

Video: For the sake of transparency, we have created a video demonstrating the hijacking process, from system startup to full compromise. Feel free to skip to 5:20, where the hijacking process begins, and watch how the compromise is completed after the virtual machine reboots.

Vulnerability: Shared Object Hijacking Leading to Arbitrary Code Execution.
Reference: CVE-2026-104809

Technical summary
CVECVE-2026-104809
VendorMitel
ProductMiVoice Office 400
SeverityHigh · CVSS 8.4
Publication date5 October 2026
Weakness categoryUncontrolled search path / untrusted shared object loading
02 / Research objective

Objective

The objective was to reconstruct a replacement for the proprietary 32-bit ELF shared library libXfTftpd.so so that the existing MSRV application could load the library and continue through its initialization path.

The primary requirement was runtime compatibility with the existing application rather than reproducing the complete original TFTP implementation.

Validation target
MSRV process starts
↓
libXfTftpd.so is loaded
↓
Expected exported symbols are available
↓
Library initialization completes
↓
Replacement code execution is validated
03 / Environment

Target environment

The target system is an embedded Linux environment running on 32-bit x86. The following processes were observed on the target.

Process inventory
root  2198  ... /home/mivo400/sw/lm/swit
root  2199  ... /home/mivo400/sw/lm/cmgr
root  2200  ... /home/mivo400/sw/lm/fmgr
root  2201  ... /home/mivo400/sw/lm/msrv

Principal validation target: /home/mivo400/sw/lm/msrv.

04 / Compilation

Build environment

A separate Oracle Linux build environment was prepared to generate a shared object compatible with the target system. The critical requirement was matching the target ABI rather than producing the default x86-64 ELF64 output.

PropertyRequired configuration
Architecturei386 / x86 32-bit
ELF classELF32
ABILinux x86
Output formatShared object (.so)
Code generationPosition-independent code

Architecture verification

ELF inspection
file libXfTftpd.so
readelf -h libXfTftpd.so
05 / Static analysis

Initial analysis of the original library

The original library was inspected using ELF symbol inspection and disassembly tools. The exported functions were identified using nm.

Symbol inspection
nm -D -C libXfTftpd.so | grep -E \
'CreateFileCb|CreateMemoryCb|FreeCbMemory|QueryFileCbTransfered|QueryMemoryCbTransfered|StopFileCbTransfer|StopMemoryCbTransfer|XfTftpGet'
AddressExported symbol
0x23e0CreateFileCb
0x2440CreateMemoryCb
0x2490QueryFileCbTransfered
0x24a0QueryMemoryCbTransfered
0x24b0StopFileCbTransfer
0x24f0StopMemoryCbTransfer
0x2530FreeCbMemory
0x3840XfTftpGet

This established the externally visible API expected from libXfTftpd.so and the initial compatibility boundary for the reconstruction.

06 / Function analysis

CreateFileCb analysis

The original CreateFileCb implementation was examined using disassembly.

Relevant disassembly excerpt
000023e0 <CreateFileCb>:
23e0: 56                   push esi
23e1: 53                   push ebx
23e2: 83 ec 14             sub  esp,0x14
23e5: c7 04 24 20 00 00 00 mov  DWORD PTR [esp],0x20
23ec: 8b 74 24 24          mov  esi,DWORD PTR [esp+0x24]
23f0: e8 fc ff ff ff       call ...
23f5: c7 40 08 0c 00 00 00 mov  DWORD PTR [eax+0x8],0xc
23fc: 89 c3                mov  ebx,eax
23fe: c7 40 04 00 00 00 00 mov  DWORD PTR [eax+0x4],0x0
...
2424: c7 43 0c 00 00 00 00 mov  DWORD PTR [ebx+0xc],0x0
242b: c6 03 00             mov  BYTE PTR [ebx],0x0
242e: c6 43 01 01          mov  BYTE PTR [ebx+0x1],0x1
2432: 89 18                mov  DWORD PTR [eax],ebx
2437: b8 00 00 00 00       mov  eax,0x0
243e: c3                   ret

The function allocates and initializes a callback structure and returns zero. The caller expects an output pointer to be populated rather than receiving the object directly as the return value.

Compatibility observation: the output-pointer behavior is part of the observable interface and must be preserved by a compatible implementation.

07 / Function analysis

CreateMemoryCb analysis

The second callback constructor was inspected to understand how the original library initializes its memory-transfer callback.

Relevant disassembly excerpt
00002440 <CreateMemoryCb>:
2440: 56                   push esi
2441: 53                   push ebx
2442: 83 ec 14             sub  esp,0x14
2445: c7 04 24 20 00 00 00 mov  DWORD PTR [esp],0x20
244c: 8b 5c 24 24          mov  ebx,DWORD PTR [esp+0x24]
2450: 8b 74 24 28          mov  esi,DWORD PTR [esp+0x28]
...
245d: c7 40 08 0c 00 00 00 mov  DWORD PTR [eax+0x8],0xc
2464: c6 00 00             mov  BYTE PTR [eax],0x0
2467: c6 40 01 01          mov  BYTE PTR [eax+0x1],0x1
246b: 89 02                mov  DWORD PTR [edx],eax
246f: 8b 16                mov  edx,DWORD PTR [esi]
2472: 89 58 14             mov  DWORD PTR [eax+0x14],ebx
2475: 89 70 1c             mov  DWORD PTR [eax+0x1c],esi
...
247e: b8 00 00 00 00       mov  eax,0x0
2485: c3                   ret

CreateMemoryCb similarly allocates and initializes a callback object and stores the resulting pointer through an output parameter.

08 / API surface

Important callback API

FunctionObserved role
CreateFileCbFile callback construction
CreateMemoryCbMemory callback construction
QueryFileCbTransferedFile-transfer query interface
QueryMemoryCbTransferedMemory-transfer query interface
StopFileCbTransferFile-transfer stop interface
StopMemoryCbTransferMemory-transfer stop interface
FreeCbMemoryCallback memory-management interface
XfTftpGetTFTP-related function referenced by the caller

The compatibility requirement was to preserve the names, visibility and calling conventions expected by the existing compiled components.

09 / Cross-library analysis

Analysis of libSL_SDK_HMPd.so

The second library involved in the observed call chain was libSL_SDK_HMPd.so. The relevant function was F2BSpImpl::StartFilePlayback(...).

Relocation inspection
readelf -r libSL_SDK_HMPd.so |
grep -E 'CreateFileCb|FreeCbMemory|XfTftpGet'
AddressRelocation typeSymbol
0x1a7da2R_386_PC32CreateFileCb
0x1a7e64R_386_PC32XfTftpGet
0x1a7e72R_386_PC32FreeCbMemory

These relocations demonstrate that the MSRV-side components reference the expected symbols. A relocation establishes a binary reference, but does not prove that the function executes during every runtime session.

10 / Disassembly

Call-site analysis

Disassembly command
objdump -d -M intel \
--start-address=0x1a7d20 \
--stop-address=0x1a7da6 \
libSL_SDK_HMPd.so

The disassembly shows argument preparation and a call associated with the relocation for CreateFileCb. Later instructions prepare arguments for XfTftpGet, followed by a call associated with FreeCbMemory.

F2BSpImpl::StartFilePlayback(...)
↓
CreateFileCb
↓
XfTftpGet
↓
FreeCbMemory
11 / Binary compatibility

Why symbol compatibility matters

The application was not rebuilt. The ABI boundary was therefore determined by the existing binaries.

Compatibility requirements
  • ELF32 / i386 binary format.
  • Compatible shared-library structure.
  • Expected exported symbol names and visibility.
  • Compatible calling conventions.
  • Correct argument and output-pointer behavior.
  • Return values compatible with caller expectations.
  • Valid memory ownership for callback objects.

The goal was not to reproduce every internal implementation detail of the proprietary library, but to understand the observable behavior at the binary interface.

12 / Runtime validation

Runtime verification

Confirm the process

Process inspection
ps -ef | grep msrv

Confirm the library mapping

Memory-map inspection
grep -F 'libXfTftpd.so' /proc/2201/maps

Observed mappings

/proc/2201/mapsObserved output
f58c3000-f58c4000 r-xp 00000000 fd:01 659871
/home/mivo400/sw/msrv/lib/libXfTftpd.so

f58c4000-f58c5000 r--p 00000000 fd:01 659871
/home/mivo400/sw/msrv/lib/libXfTftpd.so

f58c5000-f58c6000 rw-p 00001000 fd:01 659871
/home/mivo400/sw/msrv/lib/libXfTftpd.so

Observed result: the replacement library was mapped into the MSRV process address space under the expected pathname.

PermissionsTypical role
r-xpReadable and executable segment
r--pRead-only segment
rw-pReadable and writable segment

The mappings demonstrate that the shared object was mapped by the process. They do not independently prove that a specific exported function or initialization routine executed.

13 / Execution validation

Early execution test

A simple filesystem observation was considered as an initial proof-of-execution mechanism. This avoids introducing network connectivity, listener readiness and connection timing as additional variables during the first stage of validation.

Library is mapped
↓
Initialization path is reached
↓
Observable side effect occurs
↓
Execution is independently confirmed

Evidence qualification: the supplied observations establish library mapping. They do not include a separate captured output proving that the proposed test operation executed. Execution-path confirmation remains a validation item.

14 / Results

Current validation state

Established findings
  • ✓The target process was identified as MSRV.
  • ✓The replacement library path was identified.
  • ✓The relevant exported callback symbols were identified.
  • ✓XfTftpGet was identified as a relevant symbol.
  • ✓Relevant relocations in libSL_SDK_HMPd.so were identified.
  • ✓The replacement library was observed in the MSRV process memory maps.
Remaining validation work
  • !Capture explicit evidence of initialization execution.
  • !Correlate runtime observations with the MSRV startup sequence.
  • !Confirm which application callback or function path is reached.
  • !Verify application behavior across repeatable test runs.
15 / External references

References

The following sources provide the vulnerability record, official Swiss CVE information and DigitalCanion's research listing.

16 / Conclusion

Conclusion

The reconstruction process moved the investigation from static reverse engineering to runtime validation of the replacement shared object.

The key result was not merely obtaining a syntactically valid shared library. The replacement was placed at the application's expected library path and was observed directly in the existing 32-bit MSRV process address space.

Static analysis also established the relevant binary interface between libSL_SDK_HMPd.so and libXfTftpd.so, including references to CreateFileCb, XfTftpGet and FreeCbMemory.

Principal technical findings
MSRV application
↓
Existing SDK binary references
↓
Expected library and symbol interface
↓
Replacement library mapped at runtime

Need an offensive security assessment?

Our research team hunts 0-days in the world's largest vendors. Reply within 24 business hours.

Contact us