diff --git a/Pipfile.lock b/Pipfile.lock index 6cf4884..9bdfe11 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -33,100 +33,115 @@ }, "bracex": { "hashes": [ - "sha256:351b7f20d56fb9ea91f9b9e9e7664db466eb234188c175fd943f8f755c807e73", - "sha256:e7b23fc8b2cd06d3dec0692baabecb249dda94e06a617901ff03a6c56fd71693" + "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb", + "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418" ], - "markers": "python_version >= '3.7'", - "version": "==2.3.post1" + "markers": "python_version >= '3.8'", + "version": "==2.4" }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "charset-normalizer": { "hashes": [ - "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", - "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", - "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", - "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", - "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", - "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", - "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", - "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", - "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", - "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", - "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", - "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", - "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", - "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", - "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", - "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", - "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", - "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", - "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", - "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", - "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", - "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", - "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", - "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", - "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", - "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", - "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", - "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", - "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", - "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", - "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", - "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", - "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", - "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", - "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", - "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", - "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", - "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", - "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", - "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", - "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", - "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", - "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", - "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", - "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", - "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", - "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", - "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", - "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", - "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", - "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", - "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", - "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", - "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", - "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", - "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", - "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", - "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", - "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", - "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", - "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", - "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", - "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", - "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", - "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", - "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", - "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", - "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", - "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", - "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", - "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", - "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", - "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", - "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", - "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.2.0" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_version >= '3.7'", + "version": "==3.3.2" }, "click": { "hashes": [ @@ -141,7 +156,7 @@ "sha256:38a26d963ee3ad93332ddf782f9259c5bdfe405e73408d943ef5e7d0c3767ec7", "sha256:97d06703873518cc5038509443742b25069a3c7562d1ea72ff08bfadde1ce777" ], - "markers": "python_version >= '3.6' and python_version < '4'", + "markers": "python_version >= '3.6' and python_version < '4.0'", "version": "==0.5.6" }, "colorama": { @@ -150,7 +165,6 @@ "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", "version": "==0.4.6" }, "defusedxml": { @@ -177,11 +191,11 @@ }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "jschema-to-python": { "hashes": [ @@ -189,7 +203,6 @@ "sha256:8a703ca7604d42d74b2815eecf99a33359a8dccbb80806cce386d5e2dd992b05" ], "index": "pypi", - "markers": "python_version >= '2.7'", "version": "==1.2.3" }, "jsonpickle": { @@ -210,12 +223,11 @@ }, "libsast": { "hashes": [ - "sha256:424c94abadb9801dc5bb1c9afa8f189a8a4097e0b04b7a857e15da35de76c60b", - "sha256:476d43d5af63d99ea57c9ece2b5d8b7da113ece18c219a258fecc31b6fcc97bb" + "sha256:2c70f9d94ff95c3302f0a038f05f381eb6a55c2acaeda717c5c1551006a74a2f", + "sha256:8bf0ef3ad31864fcdcf073840c5875e9a2fcdb9f895617141f30c953e361577d" ], "index": "pypi", - "markers": "python_version >= '3.8' and python_version < '4.0'", - "version": "==2.0.0" + "version": "==2.0.3" }, "packaging": { "hashes": [ @@ -227,17 +239,17 @@ }, "pbr": { "hashes": [ - "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b", - "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3" + "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda", + "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9" ], "markers": "python_version >= '2.6'", - "version": "==5.11.1" + "version": "==6.0.0" }, "peewee": { "hashes": [ - "sha256:12b30e931193bc37b11f7c2ac646e3f67125a8b1a543ad6ab37ad124c8df7d16" + "sha256:3a56967f28a43ca7a4287f4803752aeeb1a57a08dee2e839b99868181dfb5df8" ], - "version": "==3.16.3" + "version": "==3.17.0" }, "pyparsing": { "hashes": [ @@ -249,36 +261,41 @@ }, "pyrsistent": { "hashes": [ - "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8", - "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440", - "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a", - "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c", - "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3", - "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393", - "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9", - "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da", - "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf", - "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64", - "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a", - "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3", - "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98", - "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2", - "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8", - "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf", - "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc", - "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7", - "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28", - "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2", - "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b", - "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a", - "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64", - "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19", - "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1", - "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9", - "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c" + "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", + "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", + "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", + "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", + "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", + "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", + "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", + "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", + "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", + "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", + "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", + "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", + "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", + "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", + "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", + "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", + "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", + "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", + "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", + "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", + "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", + "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", + "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", + "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", + "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", + "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", + "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", + "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", + "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", + "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", + "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", + "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" ], - "markers": "python_version >= '3.7'", - "version": "==0.19.3" + "markers": "python_version >= '3.8'", + "version": "==0.20.0" }, "python-lsp-jsonrpc": { "hashes": [ @@ -353,54 +370,67 @@ }, "ruamel.yaml": { "hashes": [ - "sha256:23cd2ed620231677564646b0c6a89d138b6822a0d78656df7abda5879ec4f447", - "sha256:ec939063761914e14542972a5cba6d33c23b0859ab6342f61cf070cfc600efc2" + "sha256:6024b986f06765d482b5b07e086cc4b4cd05dd22ddcbc758fa23d54873cf313d", + "sha256:b16b6c3816dff0a93dca12acf5e70afd089fa5acb80604afd1ffa8b465b7722c" ], "markers": "python_version >= '3'", - "version": "==0.17.32" + "version": "==0.17.40" }, "ruamel.yaml.clib": { "hashes": [ - "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e", - "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3", - "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5", - "sha256:1a6391a7cabb7641c32517539ca42cf84b87b667bad38b78d4d42dd23e957c81", - "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497", - "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f", - "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac", - "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697", - "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763", - "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282", - "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94", - "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1", - "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072", - "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9", - "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231", - "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93", - "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b", - "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb", - "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f", - "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307", - "sha256:9c7617df90c1365638916b98cdd9be833d31d337dbcd722485597b43c4a215bf", - "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8", - "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b", - "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b", - "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640", - "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7", - "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a", - "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71", - "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8", - "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122", - "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7", - "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80", - "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e", - "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab", - "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0", - "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646", - "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38" - ], - "markers": "python_version < '3.12' and platform_python_implementation == 'CPython'", - "version": "==0.2.7" + "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", + "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", + "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", + "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", + "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", + "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", + "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", + "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", + "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", + "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", + "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", + "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", + "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", + "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", + "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", + "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", + "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", + "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", + "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", + "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", + "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", + "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", + "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", + "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", + "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", + "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", + "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", + "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", + "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", + "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", + "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", + "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", + "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", + "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", + "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", + "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", + "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", + "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", + "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", + "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", + "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", + "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", + "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", + "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", + "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", + "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", + "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", + "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", + "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", + "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" + ], + "markers": "python_version < '3.13' and platform_python_implementation == 'CPython'", + "version": "==0.2.8" }, "sarif-om": { "hashes": [ @@ -408,7 +438,6 @@ "sha256:cd5f416b3083e00d402a92e449a7ff67af46f11241073eea0461802a3b5aef98" ], "index": "pypi", - "markers": "python_version >= '2.7'", "version": "==1.0.4" }, "semgrep": { @@ -427,7 +456,6 @@ "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.9.0" }, "tomli": { @@ -448,94 +476,98 @@ }, "typing-extensions": { "hashes": [ - "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], - "markers": "python_version >= '3.7'", - "version": "==4.7.1" + "markers": "python_version >= '3.8'", + "version": "==4.9.0" }, "ujson": { "hashes": [ - "sha256:07d459aca895eb17eb463b00441986b021b9312c6c8cc1d06880925c7f51009c", - "sha256:0be81bae295f65a6896b0c9030b55a106fb2dec69ef877253a87bc7c9c5308f7", - "sha256:0fe1b7edaf560ca6ab023f81cbeaf9946a240876a993b8c5a21a1c539171d903", - "sha256:102bf31c56f59538cccdfec45649780ae00657e86247c07edac434cb14d5388c", - "sha256:11da6bed916f9bfacf13f4fc6a9594abd62b2bb115acfb17a77b0f03bee4cfd5", - "sha256:16fde596d5e45bdf0d7de615346a102510ac8c405098e5595625015b0d4b5296", - "sha256:193349a998cd821483a25f5df30b44e8f495423840ee11b3b28df092ddfd0f7f", - "sha256:20768961a6a706170497129960762ded9c89fb1c10db2989c56956b162e2a8a3", - "sha256:27a2a3c7620ebe43641e926a1062bc04e92dbe90d3501687957d71b4bdddaec4", - "sha256:2873d196725a8193f56dde527b322c4bc79ed97cd60f1d087826ac3290cf9207", - "sha256:299a312c3e85edee1178cb6453645217ba23b4e3186412677fa48e9a7f986de6", - "sha256:2a64cc32bb4a436e5813b83f5aab0889927e5ea1788bf99b930fad853c5625cb", - "sha256:2b852bdf920fe9f84e2a2c210cc45f1b64f763b4f7d01468b33f7791698e455e", - "sha256:2e72ba76313d48a1a3a42e7dc9d1db32ea93fac782ad8dde6f8b13e35c229130", - "sha256:3659deec9ab9eb19e8646932bfe6fe22730757c4addbe9d7d5544e879dc1b721", - "sha256:3b27a8da7a080add559a3b73ec9ebd52e82cc4419f7c6fb7266e62439a055ed0", - "sha256:3f9b63530a5392eb687baff3989d0fb5f45194ae5b1ca8276282fb647f8dcdb3", - "sha256:407d60eb942c318482bbfb1e66be093308bb11617d41c613e33b4ce5be789adc", - "sha256:40931d7c08c4ce99adc4b409ddb1bbb01635a950e81239c2382cfe24251b127a", - "sha256:48c7d373ff22366eecfa36a52b9b55b0ee5bd44c2b50e16084aa88b9de038916", - "sha256:4ddeabbc78b2aed531f167d1e70387b151900bc856d61e9325fcdfefb2a51ad8", - "sha256:5ac97b1e182d81cf395ded620528c59f4177eee024b4b39a50cdd7b720fdeec6", - "sha256:5ce24909a9c25062e60653073dd6d5e6ec9d6ad7ed6e0069450d5b673c854405", - "sha256:69b3104a2603bab510497ceabc186ba40fef38ec731c0ccaa662e01ff94a985c", - "sha256:6a4dafa9010c366589f55afb0fd67084acd8added1a51251008f9ff2c3e44042", - "sha256:6d230d870d1ce03df915e694dcfa3f4e8714369cce2346686dbe0bc8e3f135e7", - "sha256:78e318def4ade898a461b3d92a79f9441e7e0e4d2ad5419abed4336d702c7425", - "sha256:7a42baa647a50fa8bed53d4e242be61023bd37b93577f27f90ffe521ac9dc7a3", - "sha256:7cba16b26efe774c096a5e822e4f27097b7c81ed6fb5264a2b3f5fd8784bab30", - "sha256:7d8283ac5d03e65f488530c43d6610134309085b71db4f675e9cf5dff96a8282", - "sha256:7ecc33b107ae88405aebdb8d82c13d6944be2331ebb04399134c03171509371a", - "sha256:9249fdefeb021e00b46025e77feed89cd91ffe9b3a49415239103fc1d5d9c29a", - "sha256:9399eaa5d1931a0ead49dce3ffacbea63f3177978588b956036bfe53cdf6af75", - "sha256:94c7bd9880fa33fcf7f6d7f4cc032e2371adee3c5dba2922b918987141d1bf07", - "sha256:9571de0c53db5cbc265945e08f093f093af2c5a11e14772c72d8e37fceeedd08", - "sha256:9721cd112b5e4687cb4ade12a7b8af8b048d4991227ae8066d9c4b3a6642a582", - "sha256:9ab282d67ef3097105552bf151438b551cc4bedb3f24d80fada830f2e132aeb9", - "sha256:9d9707e5aacf63fb919f6237d6490c4e0244c7f8d3dc2a0f84d7dec5db7cb54c", - "sha256:a70f776bda2e5072a086c02792c7863ba5833d565189e09fabbd04c8b4c3abba", - "sha256:a89cf3cd8bf33a37600431b7024a7ccf499db25f9f0b332947fbc79043aad879", - "sha256:a8c91b6f4bf23f274af9002b128d133b735141e867109487d17e344d38b87d94", - "sha256:ad24ec130855d4430a682c7a60ca0bc158f8253ec81feed4073801f6b6cb681b", - "sha256:ae7f4725c344bf437e9b881019c558416fe84ad9c6b67426416c131ad577df67", - "sha256:b748797131ac7b29826d1524db1cc366d2722ab7afacc2ce1287cdafccddbf1f", - "sha256:bdf04c6af3852161be9613e458a1fb67327910391de8ffedb8332e60800147a2", - "sha256:bf5737dbcfe0fa0ac8fa599eceafae86b376492c8f1e4b84e3adf765f03fb564", - "sha256:c4e7bb7eba0e1963f8b768f9c458ecb193e5bf6977090182e2b4f4408f35ac76", - "sha256:d524a8c15cfc863705991d70bbec998456a42c405c291d0f84a74ad7f35c5109", - "sha256:d53039d39de65360e924b511c7ca1a67b0975c34c015dd468fca492b11caa8f7", - "sha256:d6f84a7a175c75beecde53a624881ff618e9433045a69fcfb5e154b73cdaa377", - "sha256:e0147d41e9fb5cd174207c4a2895c5e24813204499fd0839951d4c8784a23bf5", - "sha256:e3673053b036fd161ae7a5a33358ccae6793ee89fd499000204676baafd7b3aa", - "sha256:e54578fa8838ddc722539a752adfce9372474114f8c127bb316db5392d942f8b", - "sha256:eb0142f6f10f57598655340a3b2c70ed4646cbe674191da195eb0985a9813b83", - "sha256:efeddf950fb15a832376c0c01d8d7713479fbeceaed1eaecb2665aa62c305aec", - "sha256:f26629ac531d712f93192c233a74888bc8b8212558bd7d04c349125f10199fcf", - "sha256:f2e385a7679b9088d7bc43a64811a7713cc7c33d032d020f757c54e7d41931ae", - "sha256:f3554eaadffe416c6f543af442066afa6549edbc34fe6a7719818c3e72ebfe95", - "sha256:f4511560d75b15ecb367eef561554959b9d49b6ec3b8d5634212f9fed74a6df1", - "sha256:f504117a39cb98abba4153bf0b46b4954cc5d62f6351a14660201500ba31fe7f", - "sha256:fb87decf38cc82bcdea1d7511e73629e651bdec3a43ab40985167ab8449b769c" + "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd", + "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd", + "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e", + "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5", + "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c", + "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437", + "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21", + "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e", + "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851", + "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562", + "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34", + "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60", + "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b", + "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4", + "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096", + "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9", + "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30", + "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320", + "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01", + "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c", + "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617", + "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0", + "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21", + "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e", + "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f", + "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120", + "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99", + "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d", + "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5", + "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad", + "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c", + "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908", + "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c", + "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164", + "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532", + "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d", + "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d", + "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378", + "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399", + "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e", + "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f", + "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b", + "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa", + "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427", + "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f", + "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae", + "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106", + "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd", + "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f", + "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36", + "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf", + "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c", + "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81", + "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c", + "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d", + "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc", + "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402", + "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f", + "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b", + "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95", + "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844", + "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124", + "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e", + "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e", + "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1" ], "markers": "python_version >= '3.8'", - "version": "==5.8.0" + "version": "==5.9.0" }, "urllib3": { "hashes": [ - "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", - "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.16" + "version": "==1.26.18" }, "wcmatch": { "hashes": [ - "sha256:3476cd107aba7b25ba1d59406938a47dc7eec6cfd0ad09ff77193f21a964dee7", - "sha256:b1f042a899ea4c458b7321da1b5e3331e3e0ec781583434de1301946ceadb943" + "sha256:14554e409b142edeefab901dc68ad570b30a72a8ab9a79106c5d5e9a6d241bd5", + "sha256:86c17572d0f75cbf3bcb1a18f3bf2f9e72b39a9c08c9b4a74e991e1882a8efb3" ], - "markers": "python_version >= '3.7'", - "version": "==8.4.1" + "markers": "python_version >= '3.8'", + "version": "==8.5" }, "xmltodict": { "hashes": [ @@ -543,7 +575,6 @@ "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852" ], "index": "pypi", - "markers": "python_version >= '3.4'", "version": "==0.13.0" } }, diff --git a/mobsfscan/__init__.py b/mobsfscan/__init__.py index 07b5af1..6325958 100644 --- a/mobsfscan/__init__.py +++ b/mobsfscan/__init__.py @@ -6,7 +6,7 @@ __title__ = 'mobsfscan' __authors__ = 'Ajin Abraham' __copyright__ = f'Copyright {datetime.now().year} Ajin Abraham, OpenSecurity' -__version__ = '0.3.4' +__version__ = '0.3.5' __version_info__ = tuple(int(i) for i in __version__.split('.')) __all__ = [ '__title__', diff --git a/mobsfscan/manifest.py b/mobsfscan/manifest.py index b6ac917..382e88b 100644 --- a/mobsfscan/manifest.py +++ b/mobsfscan/manifest.py @@ -5,12 +5,49 @@ from xmltodict import parse +import requests + from mobsfscan.logger import init_logger from mobsfscan.manifest_metadata import metadata logger = init_logger(__name__) -ANDROID_MIN_SDK = 27 +ANDROID_8_0_LEVEL = 26 +ANDROID_9_0_LEVEL = 28 +ANDROID_10_0_LEVEL = 29 +ANDROID_API_LEVEL_MAP = { + '1': '1.0', + '2': '1.1', + '3': '1.5', + '4': '1.6', + '5': '2.0-2.1', + '8': '2.2-2.2.3', + '9': '2.3-2.3.2', + '10': '2.3.3-2.3.7', + '11': '3.0', + '12': '3.1', + '13': '3.2-3.2.6', + '14': '4.0-4.0.2', + '15': '4.0.3-4.0.4', + '16': '4.1-4.1.2', + '17': '4.2-4.2.2', + '18': '4.3-4.3.1', + '19': '4.4-4.4.4', + '20': '4.4W-4.4W.2', + '21': '5.0-5.0.2', + '22': '5.1-5.1.1', + '23': '6.0-6.0.1', + '24': '7.0', + '25': '7.1-7.1.2', + '26': '8.0', + '27': '8.1', + '28': '9', + '29': '10', + '30': '11', + '31': '12', + '32': '12L', + '33': '13', +} def scan_manifest(xml_paths, validate_func): @@ -70,6 +107,7 @@ def do_checks(xml_path, p): if p.get('manifest') and p.get('manifest').get('application'): # Android Manifest min_sdk = None + target_sdk = None app = p.get('manifest').get('application') allow_backup = app.get('@android:allowBackup') clear_text = app.get('@android:usesCleartextTraffic') @@ -78,6 +116,9 @@ def do_checks(xml_path, p): if p.get('manifest').get('uses-sdk'): uses_sdk = p.get('manifest').get('uses-sdk') min_sdk = uses_sdk.get('@android:minSdkVersion') + target_sdk = uses_sdk.get('@android:targetSdkVersion') + if not target_sdk: + target_sdk = min_sdk findings = android_manifest_checks( xml_path, min_sdk, @@ -85,19 +126,24 @@ def do_checks(xml_path, p): clear_text, debuggable, test_only) + al = AppLinksCheck(findings, xml_path) + al.browsable_activity_check(app) + th = TaskHijackingChecks(findings, xml_path, target_sdk) + th.strandhogg_check(app) elif p.get('network-security-config'): # Network Security Config - nsc_finds = network_security_checks(xml_path, p) - if nsc_finds: - findings.extend(nsc_finds) + nsc = NetworkSecurityChecks(findings, xml_path) + nsc.network_security_checks(p) return findings -def add_finding(findings, xml_file, rule_id): +def add_finding(findings, xml_file, rule_id, dynamic=None): """Append Findings.""" meta = deepcopy(metadata[rule_id]) meta['id'] = rule_id meta['file'] = xml_file + if dynamic: + meta['message'] = meta['message'].format(*dynamic) findings.append(meta) @@ -110,12 +156,18 @@ def android_manifest_checks(xml_path, """Android Manifest Checks.""" findings = [] try: - conv = int(min_sdk) - if conv < ANDROID_MIN_SDK: + if int(min_sdk) < ANDROID_8_0_LEVEL: + add_finding( + findings, + xml_path, + 'android_manifest_insecure_minsdk_error', + (ANDROID_API_LEVEL_MAP.get(min_sdk), min_sdk)) + elif int(min_sdk) < ANDROID_10_0_LEVEL: add_finding( findings, xml_path, - 'android_manifest_insecure_minsdk') + 'android_manifest_insecure_minsdk_warning', + (ANDROID_API_LEVEL_MAP.get(min_sdk), min_sdk)) except (ValueError, TypeError): pass if allow_backup and allow_backup == 'true': @@ -146,74 +198,205 @@ def android_manifest_checks(xml_path, return findings -def clear_text_traffic_permitted(xml_path, conf, nsc_finds, typ): - if typ == 'base': - r = 'android_manifest_base_config_cleartext' - elif typ == 'domain': - r = 'android_manifest_domain_config_cleartext' - ctt = conf.get('@cleartextTrafficPermitted') - if ctt and ctt == 'true': - add_finding(nsc_finds, xml_path, r) - - -def trust_cert_and_cert_pinning_bypass(xml_path, cert, nsc_finds, typ): - if typ == 'base': - trule = 'android_manifest_base_config_trust_user_certs' - prule = 'android_manifest_base_config_bypass_pinning' - elif typ == 'domain': - trule = 'android_manifest_domain_config_trust_user_certs' - prule = 'android_manifest_domain_config_bypass_pinning' - src = cert.get('@src') - op = cert.get('@overridePins') - # Trust user certs - if src and src == 'user': - add_finding(nsc_finds, xml_path, trule) - # Bypass Pinning - if src and op and src == 'user' and op == 'true': - add_finding(nsc_finds, xml_path, prule) - - -def cert_instance_check(xml_path, config, nsc_finds, typ): - certs = config.get('trust-anchors').get('certificates') - if isinstance(certs, dict): - # Single cert instance - trust_cert_and_cert_pinning_bypass( - xml_path, certs, nsc_finds, typ) - elif isinstance(certs, list): - for cert in certs: - # Multiple certs instance - trust_cert_and_cert_pinning_bypass( - xml_path, cert, nsc_finds, typ) - - -def network_security_checks(xml_path, parsed_xml): - """Android Network Security Config checks.""" - nsc_finds = [] - # Base Config - if parsed_xml.get('network-security-config').get('base-config'): - typ = 'base' - base_conf = parsed_xml.get( - 'network-security-config').get('base-config') - # Clear text traffic - clear_text_traffic_permitted(xml_path, base_conf, nsc_finds, typ) - if (base_conf.get('trust-anchors') - and base_conf.get('trust-anchors').get('certificates')): - # Trust user certs - cert_instance_check(xml_path, base_conf, nsc_finds, typ) - - # Domain config - if parsed_xml.get('network-security-config').get('domain-config'): - typ = 'domain' - domain_conf = parsed_xml.get( - 'network-security-config').get('domain-config') - # Domain config clear text - clear_text_traffic_permitted(xml_path, domain_conf, nsc_finds, typ) - if domain_conf.get('domain-config'): - # Nested domain config clear text - clear_text_traffic_permitted( - xml_path, domain_conf.get('domain-config'), nsc_finds, typ) - if (domain_conf.get('trust-anchors') - and domain_conf.get('trust-anchors').get('certificates')): - # Trust user certs - cert_instance_check(xml_path, domain_conf, nsc_finds, typ) - return nsc_finds +class NetworkSecurityChecks: + + def __init__(self, findings, xml_path): + self.findings = findings + self.xml_path = xml_path + + def clear_text_traffic_permitted(self, conf, typ): + """Check for clear text traffic.""" + if typ == 'base': + r = 'android_manifest_base_config_cleartext' + elif typ == 'domain': + r = 'android_manifest_domain_config_cleartext' + else: + return + ctt = conf.get('@cleartextTrafficPermitted') + if ctt and ctt == 'true': + add_finding(self.findings, self.xml_path, r) + + def trust_cert_and_cert_pinning_bypass(self, cert, typ): + """Check for trust user certs and cert pinning bypass.""" + if typ == 'base': + trule = 'android_manifest_base_config_trust_user_certs' + prule = 'android_manifest_base_config_bypass_pinning' + elif typ == 'domain': + trule = 'android_manifest_domain_config_trust_user_certs' + prule = 'android_manifest_domain_config_bypass_pinning' + else: + return + src = cert.get('@src') + op = cert.get('@overridePins') + # Trust user certs + if src and src == 'user': + add_finding(self.findings, self.xml_path, trule) + # Bypass Pinning + if src and op and src == 'user' and op == 'true': + add_finding(self.findings, self.xml_path, prule) + + def cert_instance_check(self, config, typ): + """Check for cert instance.""" + certs = config.get('trust-anchors').get('certificates') + if isinstance(certs, dict): + # Single cert instance + self.trust_cert_and_cert_pinning_bypass( + certs, typ) + elif isinstance(certs, list): + for cert in certs: + # Multiple certs instance + self.trust_cert_and_cert_pinning_bypass( + cert, typ) + + def network_security_checks(self, parsed_xml): + """Android Network Security Config checks.""" + # Base Config + if parsed_xml.get('network-security-config').get('base-config'): + typ = 'base' + base_conf = parsed_xml.get( + 'network-security-config').get('base-config') + # Clear text traffic + self.clear_text_traffic_permitted(base_conf, typ) + if (base_conf.get('trust-anchors') + and base_conf.get('trust-anchors').get('certificates')): + # Trust user certs + self.cert_instance_check(base_conf, typ) + + # Domain config + if parsed_xml.get('network-security-config').get('domain-config'): + typ = 'domain' + domain_conf = parsed_xml.get( + 'network-security-config').get('domain-config') + # Domain config clear text + self.clear_text_traffic_permitted(domain_conf, typ) + if domain_conf.get('domain-config'): + # Nested domain config clear text + self.clear_text_traffic_permitted( + domain_conf.get('domain-config'), typ) + if (domain_conf.get('trust-anchors') + and domain_conf.get('trust-anchors').get('certificates')): + # Trust user certs + self.cert_instance_check(domain_conf, typ) + + +class AppLinksCheck: + + def __init__(self, findings, xml_path): + self.findings = findings + self.xml_path = xml_path + + def check_in_intents(self, activity): + """Check for browsable activities in Intents.""" + if not activity: + return + intents = activity.get('intent-filter') + if isinstance(intents, dict): + self.assetlinks_check(intents) + elif isinstance(intents, list): + for intent in intents: + self.assetlinks_check(intent) + + def browsable_activity_check(self, app): + """Check in Activity intents.""" + # Activities and Alias + for item in ('activity', 'activity-alias'): + activities = app.get(item) + if isinstance(activities, dict): + self.check_in_intents(activities) + elif isinstance(activities, list): + for act in activities: + self.check_in_intents(act) + + def assetlinks_check(self, intent): + """Well known assetlink check.""" + iden = 'sha256_cert_fingerprints' + well_known_path = '/.well-known/assetlinks.json' + rule = 'android_manifest_well_known_assetlinks' + well_knowns = set() + + applink_data = intent.get('data') + if isinstance(applink_data, dict): + applink_data = [applink_data] + elif not isinstance(applink_data, list): + return + for applink in applink_data: + host = applink.get('@android:host') + port = applink.get('@android:port') + scheme = applink.get('@android:scheme') + # Collect possible well-known paths + if scheme and scheme in ('http', 'https') and host: + if port: + c_url = f'{scheme}://{host}:{port}{well_known_path}' + else: + c_url = f'{scheme}://{host}{well_known_path}' + well_knowns.add(c_url) + for w_url in well_knowns: + try: + status = True + r = requests.get( + w_url, + allow_redirects=True, + timeout=5) + if not (str(r.status_code).startswith('2') + and iden in str(r.json())): + status = False + rcode = r.status_code + except Exception: + status = False + rcode = 0 + if not status: + add_finding( + self.findings, + self.xml_path, + rule, + (w_url, rcode)) + + +class TaskHijackingChecks: + + def __init__(self, findings, xml_path, target_sdk): + self.findings = findings + self.xml_path = xml_path + self.target_sdk = target_sdk + + def strandhogg_check(self, app): + """Task Hijacking check.""" + # Activities and Alias + for item in ('activity', 'activity-alias'): + activities = app.get(item) + if isinstance(activities, dict): + self.task_hijacking_checks(activities) + elif isinstance(activities, list): + for act in activities: + self.task_hijacking_checks(act) + + def task_hijacking_checks(self, activity): + """Android Task Hijacking Checks.""" + # StrandHogg 1.0 + try: + target_sdk = int(self.target_sdk) + except Exception: + target_sdk = ANDROID_8_0_LEVEL + launch_mode = activity.get('@android:launchMode') + if (target_sdk < ANDROID_9_0_LEVEL + and launch_mode == 'singleTask'): + add_finding( + self.findings, + self.xml_path, + 'android_task_hijacking1', + (target_sdk,)) + # StrandHogg 2.0 + exported_act = activity.get('@android:exported') + if not exported_act: + exported_act = 'false' + task_affinity = activity.get('@android:taskAffinity') + if not task_affinity: + task_affinity = '' + if (target_sdk < ANDROID_10_0_LEVEL + and exported_act == 'true' + and (launch_mode != 'singleInstance' or task_affinity != '')): + add_finding( + self.findings, + self.xml_path, + 'android_task_hijacking2', + (target_sdk,)) diff --git a/mobsfscan/manifest_metadata.py b/mobsfscan/manifest_metadata.py index c5b0292..a251373 100644 --- a/mobsfscan/manifest_metadata.py +++ b/mobsfscan/manifest_metadata.py @@ -97,14 +97,16 @@ '-and-Build-Settings.md'), }, }, - 'android_manifest_insecure_minsdk': { + 'android_manifest_insecure_minsdk_warning': { 'message': ( + 'App supports Android version {}, API Level: {}. ' 'This application can be installed on an older ' 'version of android that has multiple unfixed ' 'vulnerabilities. Support an Android version ' - '> 8, API 26 to receive reasonable security updates.'), + '>= 10, API 29 to receive reasonable security ' + 'updates.'), 'severity': 'WARNING', - 'reference': 'android:minSdkVersion<27', + 'reference': 'android:minSdkVersion<29', 'metadata': { 'cwe': 'cwe-1104', 'owasp-mobile': 'm1', @@ -114,6 +116,105 @@ 'master/Document/0x05a-Platform-Overview.md'), }, }, + 'android_manifest_insecure_minsdk_error': { + 'message': ( + 'App supports Android version {}, API Level: {}. ' + 'This application can be installed on an older ' + 'version of android that has multiple unfixed ' + 'vulnerabilities. These devices won\'t receive ' + 'reasonable security updates from Google. ' + 'Support an Android version >= 10, API 29 to ' + 'receive reasonable security updates.'), + 'severity': 'ERROR', + 'reference': 'android:minSdkVersion<29', + 'metadata': { + 'cwe': 'cwe-1104', + 'owasp-mobile': 'm1', + 'masvs': 'platform-1', + 'reference': ( + 'https://github.com/OWASP/owasp-mastg/blob/' + 'master/Document/0x05a-Platform-Overview.md'), + }, + }, + 'android_manifest_well_known_assetlinks': { + 'message': ( + 'App Link asset verification URL ({}) not found or ' + 'configured incorrectly. (Status code: {}). ' + 'App Links allow users to redirect from a ' + 'web URL/email to the mobile app. If this file ' + 'is missing or incorrectly configured for the ' + 'App Link host/domain, a malicious app can ' + 'hijack such URLs. This may ' + 'lead to phishing attacks, leak sensitive data ' + 'in the URI, such as PII, OAuth tokens, magic ' + 'link/password reset tokens and more. You must ' + 'verify the App Link domain by hosting the ' + 'assetlinks.json file and enabling verification ' + 'via [android:autoVerify="true"] in the ' + 'Activity intent-filter.'), + 'severity': 'ERROR', + 'reference': 'assetlinks.json file not found for android:host', + 'metadata': { + 'cwe': 'cwe-284', + 'owasp-mobile': 'm1', + 'masvs': 'platform-1', + 'reference': ( + 'https://github.com/OWASP/owasp-mastg/blob/' + 'master/Document/0x05a-Platform-Overview.md'), + }, + }, + 'android_task_hijacking1': { + 'message': ( + 'The Activity should not be having the launch ' + 'mode attribute set to "singleTask". It is then ' + 'possible for other applications to place a ' + 'malicious activity on top of the activity stack ' + 'resulting in Task Hijacking/StrandHogg 1.0 ' + 'vulnerability. This makes the application an easy ' + 'target for phishing attacks. The vulnerability can ' + 'be remediated by setting the launch mode attribute ' + 'to "singleInstance" or by setting an empty ' + 'taskAffinity (taskAffinity="") attribute. You can ' + 'also update the target SDK version ({}) of the app to ' + '28 or higher to fix this issue at platform level.'), + 'severity': 'ERROR', + 'reference': 'launchMode=singleTask and targetSdk<28', + 'metadata': { + 'cwe': 'cwe-1021', + 'owasp-mobile': 'm1', + 'masvs': 'platform-1', + 'reference': ( + 'https://github.com/OWASP/owasp-mastg/blob/' + 'master/Document/0x05a-Platform-Overview.md'), + }, + }, + 'android_task_hijacking2': { + 'message': ( + 'Activity is found to be vulnerable to ' + 'StrandHogg 2.0 task hijacking vulnerability. ' + 'When vulnerable, it is possible for other ' + 'applications to place a malicious activity ' + 'on top of the activity stack of the vulnerable ' + 'application. This makes the application an easy ' + 'target for phishing attacks. The vulnerability can ' + 'be remediated by setting the launch mode attribute ' + 'to "singleInstance" and by setting an empty ' + 'taskAffinity (taskAffinity=""). You can also update ' + 'the target SDK version ({}) of the app to 29 or higher ' + 'to fix this issue at platform level.'), + 'severity': 'ERROR', + 'reference': ('Activity exported, targetSdk<29 and ' + 'launchMode != singleInstance or ' + 'taskAffinity is not empty'), + 'metadata': { + 'cwe': 'cwe-1021', + 'owasp-mobile': 'm1', + 'masvs': 'platform-1', + 'reference': ( + 'https://github.com/OWASP/owasp-mastg/blob/' + 'master/Document/0x05a-Platform-Overview.md'), + }, + }, # Network Security Config # Base config 'android_manifest_base_config_cleartext': { diff --git a/requirements.txt b/requirements.txt index 8a3bf4a..c8e04f6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,36 +1,36 @@ attrs==21.4.0 boltons==21.0.0 -bracex==2.3.post1 -certifi==2023.7.22 -charset-normalizer==3.2.0 +bracex==2.4 +certifi==2023.11.17 +charset-normalizer==3.3.2 click==8.1.7 click-option-group==0.5.6 colorama==0.4.6 defusedxml==0.7.1 face==22.0.0 glom==22.1.0 -idna==3.4 +idna==3.6 jschema-to-python==1.2.3 jsonpickle==3.0.2 jsonschema==4.17.3 -libsast==2.0.0 +libsast==2.0.3 packaging==21.3 -pbr==5.11.1 -peewee==3.16.3 +pbr==6.0.0 +peewee==3.17.0 pyparsing==3.1.1 -pyrsistent==0.19.3 +pyrsistent==0.20.0 python-lsp-jsonrpc==1.0.0 PyYAML==6.0.1 requests==2.31.0 -ruamel.yaml==0.17.32 -ruamel.yaml.clib==0.2.7 +ruamel.yaml==0.17.40 +ruamel.yaml.clib==0.2.8 sarif-om==1.0.4 semgrep==0.117.0 tabulate==0.9.0 tomli==2.0.1 tqdm==4.66.1 -typing_extensions==4.7.1 -ujson==5.8.0 -urllib3==1.26.16 -wcmatch==8.4.1 +typing_extensions==4.9.0 +ujson==5.9.0 +urllib3==1.26.18 +wcmatch==8.5 xmltodict==0.13.0