EnigmaConsultant's picture
Upload folder using huggingface_hub
907a715 verified
|
Raw
History Blame Contribute Delete
2.9 kB

executorch FlatTensorDataMap .ptd null-pointer dereference (CWE-476)

Null-pointer dereference in the ExecuTorch .ptd (FlatTensor named-data map) loader. A crafted .ptd whose TensorLayout omits the non-required flatbuffer fields sizes and/or dim_order drives create_tensor_layout() to dereference a nullptr accessor result, crashing any process that loads the file.

  • Target: pytorch/executorch
  • Commit: 9b7fd14a91fb5222f6da83be7dcdb72af2710530
  • Vulnerable file: extension/flat_tensor/flat_tensor_data_map.cpp
  • Vulnerable function: create_tensor_layout() (lines 114-125)
  • Reached via public API: FlatTensorDataMap::get_tensor_layout() (line 143)
  • Schema: extension/flat_tensor/serialize/flat_tensor.fbs

Files

  • poc_flat_tensor.cpp - harness. Builds a malicious .ptd (FlatTensor with a NamedData whose TensorLayout omits sizes or dim_order), then drives the REAL FlatTensorDataMap::load() + get_tensor_layout("weight").
  • malicious_sizes.ptd - crafted .ptd with TensorLayout.sizes omitted. Crashes at flat_tensor_data_map.cpp:118 (sizes()->size()).
  • malicious_dimorder.ptd - crafted .ptd with TensorLayout.dim_order omitted. Crashes at line 124 (null dim_order Span consumed by TensorLayout::create).
  • asan_sizes.txt, asan_dimorder.txt - captured ASan SEGV output.

Build

Against a standard ExecuTorch ASan build (-DEXECUTORCH_BUILD_EXTENSION_FLAT_TENSOR=ON, CMAKE_CXX_FLAGS="-fsanitize=address -g -O0 -fno-omit-frame-pointer"):

clang++ -g -O0 -fsanitize=address -fno-omit-frame-pointer -std=c++17 \
  -I<build>/extension/flat_tensor/include -I<build>/include \
  -I<src>/.. -I<src>/runtime/core/portable_type/c10 \
  -I<src>/third-party/flatbuffers/include \
  poc_flat_tensor.cpp \
  <build>/extension/flat_tensor/libextension_flat_tensor.a \
  <build>/extension/data_loader/libextension_data_loader.a \
  <build>/libexecutorch_core.a <build>/libexecutorch.a \
  -o poc

Run

./poc malicious_sizes.ptd sizes        # omit sizes -> SEGV at line 118
./poc malicious_dimorder.ptd dim_order # omit dim_order -> SEGV at line 124

The malicious .ptd files are also provided pre-built and can be loaded by any application that consumes untrusted .ptd external-data files via FlatTensorDataMap.

Root cause

extension/flat_tensor/serialize/flat_tensor.fbs:

table TensorLayout {
  scalar_type: executorch_flatbuffer.ScalarType;
  sizes: [int32];      // NON-required (optional)
  dim_order: [uint8];  // NON-required (optional)
}

sizes and dim_order are optional, so the FlatBuffers accessors tensor_layout->sizes() and tensor_layout->dim_order() return nullptr when the fields are omitted. create_tensor_layout() dereferences them with no null check.

This is a research PoC for the huntr Model File Vulnerability program. All testing was performed locally.