Fix oob bias access for MatMulIntegerToFloat and DynamicQuantizeMatMul (#28499)
### Description
Fixes a heap out-of-bounds read vulnerability in `DynamicQuantizeMatMul`
and `MatMulIntegerToFloat` where a bias tensor with an incorrect number
of elements could cause memory reads beyond the allocated buffer.
## Changes
- **`dynamic_quantize_matmul.cc`**: Added element count validation for
the bias tensor in both the `ComputeCommon` path and the deferred bias
addition path (KleidiAI).
- **`matmul_integer_base.h`**: Added element count validation in the
KleidiAI pre-pack path, causing fallback to `ComputeCommon` (which then
rejects the invalid bias with a clear error).
- **Tests**: Added regression tests covering runtime bias mismatch,
initializer bias mismatch (KleidiAI fallback), and the generic
(non-KleidiAI) path for both operators.
## Why we validate element count, not shape (rank)
The validation checks `bias_tensor->Shape().Size() == N` (total element
count) rather than enforcing that the bias is strictly 1D. This is
intentional for several reasons:
1. **Backward compatibility with existing models.** It's possible that
some models may have bias tensors with shape `(1, N)` instead of `(N)`.
Enforcing rank == 1 would break these models at runtime. This exact
issue occurred with the GroupQueryAttention operator, which required
relaxing its shape validation in PR #28259.
2. **Consistent with ONNX standard practice.** Most official ONNX
operator schemas (Conv, ConvTranspose, DeformConv, Gemm,
LayerNormalization) do *not* validate bias shape in their schema's
`TypeAndShapeInferenceFunction`; they only document "1D" in the input
description text. `BatchNormalization` is the only exception.
3. **The kernel only needs N contiguous floats.** The compute
implementation accesses bias via raw data pointer
(`bias->Data<float>()`) and reads exactly `N` elements. It never indexes
into specific dimensions or assumes a particular rank. A bias of shape
`(N)`, `(1, N)`, or `(1, 1, N)` all work identically.
4. **Schema constraints cannot be relaxed without a version bump.** If
we added a strict rank check to the schema now and later discovered
models using `(1, N)`, fixing it would probably require a new opset
version (though we've never actually bumped the version for contrib ops
...).
## Motivation and Context
Without this fix, passing a bias tensor with fewer elements than `B`'s
last dimension causes the kernel to read past the end of the bias
buffer, potentially exposing sensitive memory contents or causing a
crash.