Closes #2344. `ShowBase64Offsets` writes the per-offset `staticSection` directly into HTML output. On the highlighted branches (`showVariable=true`) the static text was wrapped in an attribute-escaped tooltip and was fine, but on the `showVariable=false` branches at lines 98, 128, and 158 the raw Base64 string was assigned back to the offset variable and emitted unescaped. Combined with the explicit `<script>` eval in OutputWaiter.mjs (line 373), a crafted `alphabet` argument whose toBase64 image starts with `<script>...` produced a working XSS payload in the rendered output. The reporter's repro: https://gchq.github.io/CyberChef/#recipe=Show_Base64_offsets('%3Cscript%3Eale(1)/.ABCDEFGHIJKLMNOPQRSTUVWXYZbdfghjkmnoquvwxyz023456',false)&input=ABCDEFGHIJKDGLMNAOBCDEFGHPPP Fix: route all three `if (!showVariable)` branches through `Utils.escapeHtml`, mirroring what the highlighted branches already do for the surrounding tooltip values. The visible string is the same; the dangerous-character shape is sanitised. Tests - New `tests/operations/tests/ShowBase64Offsets.mjs` registered in `tests/operations/index.mjs`: - 'HTML escapes static output (#2344)' — alphabet whose toBase64 image starts with `<script>` must not appear verbatim in the output; the encoded form `<script>` should appear instead. - 'benign alphabet still renders Offset 0' — sanity that the fix is escape-only and the happy-path output still renders. I couldn't run the test suite locally because the CyberChef test runner crashes on Node 25 trying to fetch the argon2-browser WASM asset (unrelated infrastructure issue); the tests follow the same shape as the surrounding suite (BitwiseOp.mjs etc.) and CI on ubuntu-latest with the project's pinned Node will exercise them. Signed-off-by: SAY-5 <say.apm35@gmail.com>
214 lines
6.5 KiB
JavaScript
214 lines
6.5 KiB
JavaScript
/* eslint no-console: 0 */
|
|
|
|
/**
|
|
* Test Runner
|
|
*
|
|
* For running the tests in the test register.
|
|
*
|
|
* @author tlwr [toby@toby.codes]
|
|
* @author n1474335 [n1474335@gmail.com]
|
|
* @copyright Crown Copyright 2017
|
|
* @license Apache-2.0
|
|
*/
|
|
|
|
import { setLongTestFailure, logTestReport } from "../lib/utils.mjs";
|
|
|
|
import TestRegister from "../lib/TestRegister.mjs";
|
|
import "./tests/A1Z26CipherDecode.mjs";
|
|
import "./tests/AESKeyWrap.mjs";
|
|
import "./tests/AnalyseUUID.mjs";
|
|
import "./tests/AlternatingCaps.mjs";
|
|
import "./tests/AvroToJSON.mjs";
|
|
import "./tests/BaconCipher.mjs";
|
|
import "./tests/Base32.mjs";
|
|
import "./tests/Base45.mjs";
|
|
import "./tests/Base58.mjs";
|
|
import "./tests/Base62.mjs";
|
|
import "./tests/Base64.mjs";
|
|
import "./tests/Base85.mjs";
|
|
import "./tests/Base92.mjs";
|
|
import "./tests/BCD.mjs";
|
|
import "./tests/Bech32.mjs";
|
|
import "./tests/BitwiseOp.mjs";
|
|
import "./tests/BLAKE2b.mjs";
|
|
import "./tests/BLAKE2s.mjs";
|
|
import "./tests/BLAKE3.mjs";
|
|
import "./tests/Bombe.mjs";
|
|
import "./tests/BSON.mjs";
|
|
import "./tests/ByteRepr.mjs";
|
|
import "./tests/CaesarBoxCipher.mjs";
|
|
import "./tests/CaretMdecode.mjs";
|
|
import "./tests/CartesianProduct.mjs";
|
|
import "./tests/CBORDecode.mjs";
|
|
import "./tests/CBOREncode.mjs";
|
|
import "./tests/CetaceanCipherDecode.mjs";
|
|
import "./tests/CetaceanCipherEncode.mjs";
|
|
import "./tests/ChaCha.mjs";
|
|
import "./tests/ChangeIPFormat.mjs";
|
|
import "./tests/CharEnc.mjs";
|
|
import "./tests/Charts.mjs";
|
|
import "./tests/Ciphers.mjs";
|
|
import "./tests/CipherSaber2.mjs";
|
|
import "./tests/CMAC.mjs";
|
|
import "./tests/Code.mjs";
|
|
import "./tests/Colossus.mjs";
|
|
import "./tests/Comment.mjs";
|
|
import "./tests/Compress.mjs";
|
|
import "./tests/ConditionalJump.mjs";
|
|
import "./tests/ConvertCoordinateFormat.mjs";
|
|
import "./tests/ConvertLeetSpeak.mjs";
|
|
import "./tests/ConvertToNATOAlphabet.mjs";
|
|
import "./tests/CRCChecksum.mjs";
|
|
import "./tests/Crypt.mjs";
|
|
import "./tests/CSV.mjs";
|
|
import "./tests/DateTime.mjs";
|
|
import "./tests/DefangIP.mjs";
|
|
import "./tests/DisassembleARM.mjs";
|
|
import "./tests/DropNthBytes.mjs";
|
|
import "./tests/ECDSA.mjs";
|
|
import "./tests/ELFInfo.mjs";
|
|
import "./tests/Enigma.mjs";
|
|
import "./tests/ExtractAudioMetadata.mjs";
|
|
import "./tests/ExtractEmailAddresses.mjs";
|
|
import "./tests/ExtractHashes.mjs";
|
|
import "./tests/ExtractIPAddresses.mjs";
|
|
import "./tests/Fernet.mjs";
|
|
import "./tests/Float.mjs";
|
|
import "./tests/FileTree.mjs";
|
|
import "./tests/FletcherChecksum.mjs";
|
|
import "./tests/Fork.mjs";
|
|
import "./tests/FromDecimal.mjs";
|
|
import "./tests/GenerateAllChecksums.mjs";
|
|
import "./tests/GenerateAllHashes.mjs";
|
|
import "./tests/GenerateDeBruijnSequence.mjs";
|
|
import "./tests/GenerateQRCode.mjs";
|
|
import "./tests/GetAllCasings.mjs";
|
|
import "./tests/GOST.mjs";
|
|
import "./tests/Gunzip.mjs";
|
|
import "./tests/Gzip.mjs";
|
|
import "./tests/Hash.mjs";
|
|
import "./tests/HASSH.mjs";
|
|
import "./tests/HaversineDistance.mjs";
|
|
import "./tests/Hex.mjs";
|
|
import "./tests/Hexdump.mjs";
|
|
import "./tests/HKDF.mjs";
|
|
import "./tests/Image.mjs";
|
|
import "./tests/IndexOfCoincidence.mjs";
|
|
import "./tests/JA3Fingerprint.mjs";
|
|
import "./tests/JA4.mjs";
|
|
import "./tests/JA3SFingerprint.mjs";
|
|
import "./tests/Jsonata.mjs";
|
|
import "./tests/JSONBeautify.mjs";
|
|
import "./tests/JSONMinify.mjs";
|
|
import "./tests/JSONtoCSV.mjs";
|
|
import "./tests/Jump.mjs";
|
|
import "./tests/JWK.mjs";
|
|
import "./tests/JWTDecode.mjs";
|
|
import "./tests/JWTSign.mjs";
|
|
import "./tests/JWTVerify.mjs";
|
|
import "./tests/LevenshteinDistance.mjs";
|
|
import "./tests/Lorenz.mjs";
|
|
import "./tests/LS47.mjs";
|
|
import "./tests/LuhnChecksum.mjs";
|
|
import "./tests/LZNT1Decompress.mjs";
|
|
import "./tests/LZString.mjs";
|
|
import "./tests/Magic.mjs";
|
|
import "./tests/Media.mjs";
|
|
import "./tests/MIMEDecoding.mjs";
|
|
import "./tests/Modhex.mjs";
|
|
import "./tests/MorseCode.mjs";
|
|
import "./tests/MS.mjs";
|
|
import "./tests/MultipleBombe.mjs";
|
|
import "./tests/MurmurHash3.mjs";
|
|
import "./tests/NetBIOS.mjs";
|
|
import "./tests/NormaliseUnicode.mjs";
|
|
import "./tests/NTLM.mjs";
|
|
import "./tests/OTP.mjs";
|
|
import "./tests/ParseEthernetFrame.mjs";
|
|
import "./tests/ParseIPRange.mjs";
|
|
import "./tests/ParseObjectIDTimestamp.mjs";
|
|
import "./tests/ParseQRCode.mjs";
|
|
import "./tests/ParseSSHHostKey.mjs";
|
|
import "./tests/ParseTCP.mjs";
|
|
import "./tests/ParseTLSRecord.mjs";
|
|
import "./tests/ParseTLV.mjs";
|
|
import "./tests/ParseUDP.mjs";
|
|
import "./tests/PEMtoHex.mjs";
|
|
import "./tests/PGP.mjs";
|
|
import "./tests/PHP.mjs";
|
|
import "./tests/ParityBit.mjs";
|
|
import "./tests/PHPSerialize.mjs";
|
|
import "./tests/PowerSet.mjs";
|
|
import "./tests/Protobuf.mjs";
|
|
import "./tests/PubKeyFromCert.mjs";
|
|
import "./tests/PubKeyFromPrivKey.mjs";
|
|
import "./tests/Rabbit.mjs";
|
|
import "./tests/RAKE.mjs";
|
|
import "./tests/Regex.mjs";
|
|
import "./tests/Register.mjs";
|
|
import "./tests/RegularExpression.mjs";
|
|
import "./tests/RenderMarkdown.mjs";
|
|
import "./tests/RisonEncodeDecode.mjs";
|
|
import "./tests/Rotate.mjs";
|
|
import "./tests/RSA.mjs";
|
|
import "./tests/Salsa20.mjs";
|
|
import "./tests/XSalsa20.mjs";
|
|
import "./tests/SeqUtils.mjs";
|
|
import "./tests/SetDifference.mjs";
|
|
import "./tests/SetIntersection.mjs";
|
|
import "./tests/SetUnion.mjs";
|
|
import "./tests/ShowBase64Offsets.mjs";
|
|
import "./tests/Shuffle.mjs";
|
|
import "./tests/SIGABA.mjs";
|
|
import "./tests/SM2.mjs";
|
|
import "./tests/SM4.mjs";
|
|
import "./tests/RC6.mjs";
|
|
// import "./tests/SplitColourChannels.mjs"; // Cannot test operations that use the File type yet
|
|
import "./tests/SQLBeautify.mjs";
|
|
import "./tests/StrUtils.mjs";
|
|
import "./tests/StripIPv4Header.mjs";
|
|
import "./tests/StripTCPHeader.mjs";
|
|
import "./tests/StripUDPHeader.mjs";
|
|
import "./tests/Subsection.mjs";
|
|
import "./tests/SwapCase.mjs";
|
|
import "./tests/SymmetricDifference.mjs";
|
|
import "./tests/TakeNthBytes.mjs";
|
|
import "./tests/Template.mjs";
|
|
import "./tests/TextEncodingBruteForce.mjs";
|
|
import "./tests/TextIntegerConverter.mjs";
|
|
import "./tests/ToFromInsensitiveRegex.mjs";
|
|
import "./tests/TranslateDateTimeFormat.mjs";
|
|
import "./tests/Typex.mjs";
|
|
import "./tests/UnescapeString.mjs";
|
|
import "./tests/Unicode.mjs";
|
|
import "./tests/URLEncodeDecode.mjs";
|
|
import "./tests/RSA.mjs";
|
|
import "./tests/CBOREncode.mjs";
|
|
import "./tests/CBORDecode.mjs";
|
|
import "./tests/JA3Fingerprint.mjs";
|
|
import "./tests/JA3SFingerprint.mjs";
|
|
import "./tests/HASSH.mjs";
|
|
import "./tests/JSONtoYAML.mjs";
|
|
|
|
// Cannot test operations that use the File type yet
|
|
// import "./tests/SplitColourChannels.mjs";
|
|
import "./tests/YARA.mjs";
|
|
import "./tests/ParseCSR.mjs";
|
|
import "./tests/XXTEA.mjs";
|
|
|
|
const testStatus = {
|
|
allTestsPassing: true,
|
|
counts: {
|
|
total: 0,
|
|
},
|
|
};
|
|
|
|
setLongTestFailure();
|
|
|
|
const logOpsTestReport = logTestReport.bind(null, testStatus);
|
|
|
|
(async function () {
|
|
const results = await TestRegister.runTests();
|
|
logOpsTestReport(results);
|
|
})();
|