Skip to content

Commit e611bbc

Browse files
rascanifacebook-github-bot
authored andcommitted
Add overflow checks to getLeadingDims and getTrailingDims
Summary: Add `c10::mul_overflows()` checks to the dimension-product loops in `getLeadingDims()` and `getTrailingDims()`. Both functions multiply tensor dimension sizes in a loop with no overflow protection. On 32-bit targets where `size_t` is 32 bits, malicious tensor dimensions from a crafted `.pte` file can cause the product to wrap silently, producing a small value that is then used for buffer offset calculations in 40+ kernels via `coordinateToIndex()`. This enables heap buffer overflows during operator execution. MACA-2026-001 (T267380210). Differential Revision: D103467782
1 parent a3dd0fa commit e611bbc

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

runtime/core/exec_aten/util/tensor_util.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#pragma once
1010

1111
#include <c10/util/irange.h>
12+
#include <c10/util/safe_numerics.h>
1213
#include <algorithm>
1314
#include <array> // std::array
1415
#include <cinttypes> // PRId64
@@ -932,7 +933,12 @@ inline size_t getLeadingDims(
932933
ssize_t(tensor.dim()));
933934
size_t dims = 1;
934935
for (const auto i : c10::irange(dim)) {
935-
dims *= static_cast<size_t>(tensor.size(i));
936+
size_t next_dims;
937+
ET_CHECK_MSG(
938+
!c10::mul_overflows(dims, static_cast<size_t>(tensor.size(i)), &next_dims),
939+
"Overflow computing leading dims at dimension %zd",
940+
(ssize_t)i);
941+
dims = next_dims;
936942
}
937943
return dims;
938944
}
@@ -949,7 +955,12 @@ inline size_t getTrailingDims(
949955
ssize_t(tensor.dim()));
950956
size_t dims = 1;
951957
for (size_t i = dim + 1; i < static_cast<size_t>(tensor.dim()); ++i) {
952-
dims *= static_cast<size_t>(tensor.size(i));
958+
size_t next_dims;
959+
ET_CHECK_MSG(
960+
!c10::mul_overflows(dims, static_cast<size_t>(tensor.size(i)), &next_dims),
961+
"Overflow computing trailing dims at dimension %zu",
962+
i);
963+
dims = next_dims;
953964
}
954965
return dims;
955966
}

0 commit comments

Comments
 (0)