`annotation_layer.js` has logic to keep input elements in sync. The logic uses `document.getElementsByName` with [a name derived from the PDF](https://github.com/mozilla/pdf.js/blob/10a1db698047e612e8ae3da66d12a6c1ac5597a3/src/core/annotation.js#L407) to retrieve the set of related elements. This query is not namespaced, so if the viewer ever adds a `name` attribute to a checkbox or radio input in the page, then the PDF file can get it changed (without user interaction via the scripting interface). Fortunately, there doesn't appear to be any input/radio element in the default viewer code. A custom viewer can be affected by this bug, however.

I suggest to replace the `document.getElementsByTagName` calls with a function that checks that the elements are created by the `annotation_layer.js` code before returning them. There are several ways to do so, e.g. by adding a custom attribute to each input element.

## Seemingly generic property assignment
This code on its own looks dangerous because it allows the caller to overwrite any property
https://github.com/mozilla/pdf.js/blob/99e442941c16561e8826a925b164d79f4ad51fbf/src/display/annotation_layer.js#L684-L688
Fortunately, it is only called with a fixed key, so only the `value` property can be updated in response to user input events:
https://github.com/mozilla/pdf.js/blob/99e442941c16561e8826a925b164d79f4ad51fbf/src/display/annotation_layer.js#L732-L740

## Unchecking other checkboxes on checkbox state change
https://github.com/mozilla/pdf.js/blob/99e442941c16561e8826a925b164d79f4ad51fbf/src/display/annotation_layer.js#L979-L990

## Updating the abstract state (storage)
https://github.com/mozilla/pdf.js/blob/99e442941c16561e8826a925b164d79f4ad51fbf/src/display/annotation_layer.js#L1061-L1065

## Allowing scripts to uncheck checkbox/radio inputs
The others require user interaction to have any effect; this one allows scripts embedded in the PDF to run logic without user interaction.
https://github.com/mozilla/pdf.js/blob/99e442941c16561e8826a925b164d79f4ad51fbf/src/display/annotation_layer.js#L1073-L1077
createPDFNetworkStream = pdfNetworkStreamFactory;
}
/**
 * @typedef { Int8Array | Uint8Array | Uint8ClampedArray |
 *            Int16Array | Uint16Array |
 *            Int32Array | Uint32Array | Float32Array |
 *            Float64Array
 * } TypedArray
 */
/**
 * @typedef {Object} RefProxy
 * @property {number} num
 * @property {number} gen
 */
/**
 * Document initialization / loading parameters object.
 *
 * @typedef {Object} DocumentInitParameters
 * @property {string|URL} [url] - The URL of the PDF.
 * @property {TypedArray|Array<number>|string} [data] - Binary PDF data. Use
 *    typed arrays (Uint8Array) to improve the memory usage. If PDF data is
 *    BASE64-encoded, use `atob()` to convert it to a binary string first.
 * @property {Object} [httpHeaders] - Basic authentication headers.
 * @property {boolean} [withCredentials] - Indicates whether or not
 *   cross-site Access-Control requests should be made using credentials such
 *   as cookies or authorization headers. The default is `false`.
 * @property {string} [password] - For decrypting password-protected PDFs.
 * @property {TypedArray} [initialData] - A typed array with the first portion
 *   or all of the pdf data. Used by the extension since some data is already
 *   loaded before the switch to range requests.