@ksl101/vulnreaper 0.0.0-stage → 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @ksl101/vulnreaper might be problematic. Click here for more details.
- package/LICENSE +107 -0
- package/README.md +200 -3
- package/bin/vulnreaper.js +11 -0
- package/lib/cli.js +36 -0
- package/lib/resolve-core.js +109 -0
- package/package.json +39 -4
- package/vendor/vulnreaper/__init__.py +23 -0
- package/vendor/vulnreaper/__main__.py +7 -0
- package/vendor/vulnreaper/_platform.py +101 -0
- package/vendor/vulnreaper/android/__init__.py +4 -0
- package/vendor/vulnreaper/android/adb.py +89 -0
- package/vendor/vulnreaper/android/apk.py +201 -0
- package/vendor/vulnreaper/android/dex_analysis.py +65 -0
- package/vendor/vulnreaper/android/manifest.py +156 -0
- package/vendor/vulnreaper/android/native.py +67 -0
- package/vendor/vulnreaper/cli/__init__.py +4 -0
- package/vendor/vulnreaper/cli/app.py +588 -0
- package/vendor/vulnreaper/cli/autocomplete.py +50 -0
- package/vendor/vulnreaper/cli/commands.py +300 -0
- package/vendor/vulnreaper/cli/components/__init__.py +11 -0
- package/vendor/vulnreaper/cli/components/banner.py +81 -0
- package/vendor/vulnreaper/cli/components/error.py +29 -0
- package/vendor/vulnreaper/cli/components/finding.py +105 -0
- package/vendor/vulnreaper/cli/components/palette.py +65 -0
- package/vendor/vulnreaper/cli/components/spinner.py +96 -0
- package/vendor/vulnreaper/cli/components/status.py +55 -0
- package/vendor/vulnreaper/cli/dashboard.py +51 -0
- package/vendor/vulnreaper/cli/intent.py +84 -0
- package/vendor/vulnreaper/cli/prompt.py +354 -0
- package/vendor/vulnreaper/cli/repl.py +243 -0
- package/vendor/vulnreaper/cli/terminal.py +105 -0
- package/vendor/vulnreaper/cli/theme.py +170 -0
- package/vendor/vulnreaper/config.py +232 -0
- package/vendor/vulnreaper/database.py +253 -0
- package/vendor/vulnreaper/engine.py +493 -0
- package/vendor/vulnreaper/findings/__init__.py +4 -0
- package/vendor/vulnreaper/findings/model.py +110 -0
- package/vendor/vulnreaper/findings/report.py +227 -0
- package/vendor/vulnreaper/formats/__init__.py +4 -0
- package/vendor/vulnreaper/formats/axml.py +253 -0
- package/vendor/vulnreaper/formats/dex.py +180 -0
- package/vendor/vulnreaper/formats/elf.py +157 -0
- package/vendor/vulnreaper/formats/il2cpp_metadata.py +135 -0
- package/vendor/vulnreaper/formats/strings.py +102 -0
- package/vendor/vulnreaper/gating.py +85 -0
- package/vendor/vulnreaper/il2cpp/__init__.py +4 -0
- package/vendor/vulnreaper/il2cpp/detector.py +116 -0
- package/vendor/vulnreaper/il2cpp/dumper.py +89 -0
- package/vendor/vulnreaper/licensing.py +341 -0
- package/vendor/vulnreaper/logging_setup.py +48 -0
- package/vendor/vulnreaper/pipeline.py +106 -0
- package/vendor/vulnreaper/project.py +126 -0
- package/vendor/vulnreaper/rules/android.json +77 -0
- package/vendor/vulnreaper/rules/crypto.json +65 -0
- package/vendor/vulnreaper/rules/network.json +65 -0
- package/vendor/vulnreaper/rules/secrets.json +101 -0
- package/vendor/vulnreaper/rules/unity.json +41 -0
- package/vendor/vulnreaper/scanners/__init__.py +4 -0
- package/vendor/vulnreaper/scanners/android.py +158 -0
- package/vendor/vulnreaper/scanners/native.py +65 -0
- package/vendor/vulnreaper/scanners/ruleengine.py +156 -0
- package/vendor/vulnreaper/scanners/web.py +58 -0
- package/vendor/vulnreaper/tools.py +226 -0
- package/vendor/vulnreaper/ui.py +126 -0
- package/vendor/vulnreaper/unity/__init__.py +4 -0
- package/vendor/vulnreaper/unity/detector.py +90 -0
- package/vendor/vulnreaper/updates.py +299 -0
- package/vendor/vulnreaper/web/__init__.py +4 -0
- package/vendor/vulnreaper/web/endpoints.py +124 -0
- package/vendor/vulnreaper/workspace.py +81 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
VulnReaper — CONTRAT DE LICENCE UTILISATEUR FINAL (EULA)
|
|
2
|
+
Version du contrat : 0.1.0-beta.0
|
|
3
|
+
Copyright (c) 2026 KSL101. Tous droits réservés.
|
|
4
|
+
|
|
5
|
+
En installant, en activant ou en utilisant le logiciel VulnReaper (le « Logiciel »),
|
|
6
|
+
vous (l'« Utilisateur ») acceptez les termes du présent contrat. Si vous n'acceptez
|
|
7
|
+
pas ces termes, n'installez pas, n'activez pas et n'utilisez pas le Logiciel.
|
|
8
|
+
|
|
9
|
+
1. DÉFINITIONS
|
|
10
|
+
1.1 « Logiciel » : le cœur d'analyse, la CLI, le lanceur npm `@ksl101/vulnreaper`
|
|
11
|
+
(commandes `vulnreaper` et `vr`), les binaires, les règles et la documentation
|
|
12
|
+
associés, distribués sous quelque forme que ce soit.
|
|
13
|
+
1.2 « Clé de licence » : le jeton nominatif fourni par l'Éditeur permettant
|
|
14
|
+
d'activer le Logiciel.
|
|
15
|
+
1.3 « Serveur de licence » : le service d'authentification et d'autorisation
|
|
16
|
+
utilisé pour l'activation et le contrôle des permissions.
|
|
17
|
+
1.4 « Éditeur » : KSL101, titulaire des droits sur le Logiciel.
|
|
18
|
+
|
|
19
|
+
2. OCTROI DE LICENCE
|
|
20
|
+
2.1 Sous réserve du paiement éventuel et du respect du présent contrat, l'Éditeur
|
|
21
|
+
accorde à l'Utilisateur une licence nominative, non exclusive, non cessible et
|
|
22
|
+
non transférable d'utiliser le Logiciel, dans la limite du nombre d'appareils
|
|
23
|
+
autorisés pour sa Clé de licence.
|
|
24
|
+
2.2 La Clé de licence est stricto personnelle. Elle ne peut être partagée,
|
|
25
|
+
revendue, louée, prêtée ni publiée.
|
|
26
|
+
2.3 Le Logiciel est concédé sous licence, non vendu. L'Éditeur conserve tous les
|
|
27
|
+
droits, titres et intérêts non expressément accordés.
|
|
28
|
+
|
|
29
|
+
3. ACTIVATION, APPAREIL ET SESSION
|
|
30
|
+
3.1 L'activation associe la Clé de licence à un ou plusieurs appareils. Un
|
|
31
|
+
identifiant d'appareil technique peut être généré et transmis au Serveur de
|
|
32
|
+
licence aux seules fins d'activation, de contrôle des permissions et de
|
|
33
|
+
sécurité.
|
|
34
|
+
3.2 Les jetons de session sont stockés localement et uniquement pour maintenir
|
|
35
|
+
l'authentification. La Clé de licence en clair n'est pas conservée par le
|
|
36
|
+
Logiciel après échange contre des jetons.
|
|
37
|
+
3.3 L'Utilisateur s'engage à ne pas dissimuler, falsifier ni manipuler
|
|
38
|
+
l'identité d'appareil afin de contourner la limite d'appareils.
|
|
39
|
+
|
|
40
|
+
4. RESTRICTIONS
|
|
41
|
+
Sauf autorisation écrite préalable de l'Éditeur, l'Utilisateur ne peut pas :
|
|
42
|
+
4.1 copier, distribuer, publier, mettre à disposition ou revendre le Logiciel ou
|
|
43
|
+
une partie de celui-ci, y compris sous forme compilée ou reconditionnée ;
|
|
44
|
+
4.2 contourner, désactiver, neutraliser ou altérer le mécanisme de licence,
|
|
45
|
+
d'activation, d'authentification ou de contrôle des permissions, ni retirer
|
|
46
|
+
les mentions de copyright ou de propriété ;
|
|
47
|
+
4.3 rétro-concevoir, décompiler ou désassembler le Logiciel, sauf dans la mesure
|
|
48
|
+
strictement permise par une disposition légale impérative ;
|
|
49
|
+
4.4 modifier, traduire ou créer des œuvres dérivées du Logiciel ;
|
|
50
|
+
4.5 utiliser le Logiciel pour développer un produit concurrent.
|
|
51
|
+
|
|
52
|
+
5. UTILISATION AUTORISÉE — OBLIGATION LÉGALE
|
|
53
|
+
5.1 Le Logiciel est un outil d'audit de sécurité destiné aux professionnels.
|
|
54
|
+
L'Utilisateur s'engage à ne l'utiliser que sur des cibles (applications,
|
|
55
|
+
paquets, systèmes) pour lesquelles il dispose d'une autorisation explicite,
|
|
56
|
+
ou dans le cadre d'un programme de bug-bounty l'y habilitant.
|
|
57
|
+
5.2 Toute utilisation contre des systèmes tiers sans autorisation est
|
|
58
|
+
strictement interdite et relève de la seule responsabilité de l'Utilisateur.
|
|
59
|
+
5.3 L'Utilisateur demeure seul responsable du respect des lois et règlements
|
|
60
|
+
applicables dans sa juridiction.
|
|
61
|
+
|
|
62
|
+
6. STATUT BÊTA — ABSENCE DE GARANTIE
|
|
63
|
+
6.1 Le Logiciel est fourni « EN L'ÉTAT » et « SELON DISPONIBILITÉ », en version
|
|
64
|
+
bêta, sans garantie d'aucune sorte, expresse ou implicite, y compris, sans
|
|
65
|
+
limitation, les garanties de qualité marchande, d'adéquation à un usage
|
|
66
|
+
particulier et d'absence de contrefaçon.
|
|
67
|
+
6.2 L'Éditeur ne garantit pas que le Logiciel sera exempt d'erreurs, ni que son
|
|
68
|
+
fonctionnement sera ininterrompu, ni qu'il détectera l'intégralité des
|
|
69
|
+
vulnérabilités d'une cible donnée.
|
|
70
|
+
|
|
71
|
+
7. LIMITATION DE RESPONSABILITÉ
|
|
72
|
+
7.1 Dans toute la mesure permise par la loi, l'Éditeur ne saurait être tenu
|
|
73
|
+
responsable de tout dommage indirect, accessoire, spécial, consécutif ou
|
|
74
|
+
punitif, ni de toute perte de données, de revenus ou d'exploitation,
|
|
75
|
+
résultant de l'utilisation ou de l'impossibilité d'utiliser le Logiciel.
|
|
76
|
+
7.2 La responsabilité globale de l'Éditeur, toutes causes confondues, est
|
|
77
|
+
limitée au montant effectivement payé par l'Utilisateur pour la licence au
|
|
78
|
+
cours des douze (12) mois précédant le fait générateur.
|
|
79
|
+
|
|
80
|
+
8. DONNÉES TECHNIQUES
|
|
81
|
+
8.1 Le Logiciel peut transmettre au Serveur de licence des données strictement
|
|
82
|
+
nécessaires à l'activation, au contrôle des permissions, à la sécurité et à
|
|
83
|
+
l'audit des accès. Aucune cible analysée, aucun code d'application et aucun
|
|
84
|
+
résultat de scan ne sont transmis automatiquement.
|
|
85
|
+
8.2 Les données techniques sont traitées conformément à la réglementation
|
|
86
|
+
applicable en matière de protection des données personnelles.
|
|
87
|
+
|
|
88
|
+
9. DURÉE ET RÉSILIATION
|
|
89
|
+
9.1 Le présent contrat prend effet à la première utilisation et demeure en
|
|
90
|
+
vigueur jusqu'à résiliation.
|
|
91
|
+
9.2 L'Éditeur peut suspendre ou révoquer la Clé de licence, ainsi que l'accès au
|
|
92
|
+
Serveur de licence, en cas de violation du présent contrat.
|
|
93
|
+
9.3 En cas de résiliation, l'Utilisateur doit cesser toute utilisation et
|
|
94
|
+
supprimer les copies du Logiciel en sa possession.
|
|
95
|
+
|
|
96
|
+
10. DROIT APPLICABLE
|
|
97
|
+
10.1 Le présent contrat est régi par le droit applicable au siège de l'Éditeur,
|
|
98
|
+
sans préjudice des règles impératives protégeant les consommateurs.
|
|
99
|
+
10.2 Tout litige relève de la compétence exclusive des tribunaux de ce ressort.
|
|
100
|
+
|
|
101
|
+
11. CONTACT
|
|
102
|
+
Pour toute question relative aux licences, à l'activation ou au présent contrat,
|
|
103
|
+
contactez l'Éditeur via les canaux officiels du projet.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
Le présent document constitue l'intégralité de l'accord entre les parties
|
|
107
|
+
relativement à son objet et prévaut sur tout accord antérieur.
|
package/README.md
CHANGED
|
@@ -1,3 +1,200 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# VulnReaper — Plateforme d'analyse statique pour la sécurité Android
|
|
2
|
+
|
|
3
|
+
**VulnReaper** est une plateforme d'analyse statique **offline-first** destinée au
|
|
4
|
+
bug-bounty et à la recherche sécurité sur les **jeux Android** (APK natifs,
|
|
5
|
+
Unity et IL2CPP). Elle tourne en **pur Python** (bibliothèque standard
|
|
6
|
+
uniquement), sans dépendance runtime, et est **conçue pour Windows en priorité**,
|
|
7
|
+
tout en restant compatible POSIX.
|
|
8
|
+
|
|
9
|
+
Elle transforme un APK en un rapport exploitable : surface d'attaque
|
|
10
|
+
(manifest), chaînes et secrets, endpoints/hosts, bibliothèques natives et
|
|
11
|
+
métadonnées IL2CPP — le tout corrélé par un moteur de règles JSON.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Points clés
|
|
16
|
+
|
|
17
|
+
- **Aucune dépendance runtime** : uniquement la bibliothèque standard.
|
|
18
|
+
- **Jamais de résultats fabriqués** : un outil externe absent est marqué
|
|
19
|
+
`missing` et l'étape correspondante est `skipped`, jamais simulée.
|
|
20
|
+
- **Windows-first** : encodage UTF-8, couleurs ANSI (VT), gestion des chemins et
|
|
21
|
+
des sous-processus adaptée à Windows.
|
|
22
|
+
- **Analyses natives sans décompilateur** : parseurs intégrés DEX, AXML
|
|
23
|
+
(manifest compilé), ELF et `global-metadata.dat` (IL2CPP v24–v31).
|
|
24
|
+
- **Rapports** JSON, Markdown et HTML prêts à joindre à un rapport de bug bounty.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Installation
|
|
29
|
+
|
|
30
|
+
### Bêta publique (npm)
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
npm install -g @ksl101/vulnreaper@beta
|
|
34
|
+
vr version
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Prérequis : Node.js ≥ 18 et Python ≥ 3.10 (le paquet embarque le cœur Python
|
|
38
|
+
complet, exécuté par le lanceur `vr` / `vulnreaper`).
|
|
39
|
+
|
|
40
|
+
VulnReaper est sous licence nominative : activez votre clé avec
|
|
41
|
+
`vr login --key VR-...`, puis consultez `vr whoami`. Les commandes `scan` et
|
|
42
|
+
`report` exigent une permission (`scan.run`, `report.export`) ; les permissions
|
|
43
|
+
`recon.run` et `audit.run` sont réservées aux futures commandes `recon`/`audit`.
|
|
44
|
+
Voir **[docs/BETA_TESTERS.md](docs/BETA_TESTERS.md)** pour le guide complet des
|
|
45
|
+
testeurs.
|
|
46
|
+
|
|
47
|
+
### Depuis les sources
|
|
48
|
+
|
|
49
|
+
Aucune installation n'est requise pour utiliser VulnReaper depuis les sources.
|
|
50
|
+
|
|
51
|
+
```bat
|
|
52
|
+
:: Windows (invité de commandes)
|
|
53
|
+
vulnreaper.bat doctor
|
|
54
|
+
vulnreaper.bat scan C:\path\to\game.apk --profile apk-static
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
# Git Bash / Linux / macOS
|
|
59
|
+
./vulnreaper.sh doctor
|
|
60
|
+
./vulnreaper.sh scan /path/to/game.apk --profile apk-static
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Ou directement via Python (à la racine du dépôt) :
|
|
64
|
+
|
|
65
|
+
```bat
|
|
66
|
+
python -m vulnreaper doctor
|
|
67
|
+
python -m vulnreaper scan C:\path\to\game.apk
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Installation optionnelle comme commande globale :
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
pip install -e .
|
|
74
|
+
vulnreaper --version
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Commandes
|
|
80
|
+
|
|
81
|
+
| Commande | Description |
|
|
82
|
+
| --- | --- |
|
|
83
|
+
| `vulnreaper doctor` | Diagnostic de l'environnement et des outils externes |
|
|
84
|
+
| `vulnreaper version` | Affiche la version |
|
|
85
|
+
| `vulnreaper profiles` | Liste les profils de scan |
|
|
86
|
+
| `vulnreaper rules [--json]` | Liste les règles chargées |
|
|
87
|
+
| `vulnreaper tools [--missing\|--available] [--json]` | Inspecte les outils externes |
|
|
88
|
+
| `vulnreaper project create\|list\|show\|delete <nom>` | Gère les projets/workspaces |
|
|
89
|
+
| `vulnreaper scan <apk> [--profile P] [--project N] [--json]` | Lance un scan |
|
|
90
|
+
| `vulnreaper runs [--project N]` | Liste les runs |
|
|
91
|
+
| `vulnreaper findings [--run ID] [--severity S]` | Affiche les findings |
|
|
92
|
+
| `vulnreaper report --run ID` | Chemin des rapports générés |
|
|
93
|
+
| `vulnreaper config show\|init` | Affiche / initialise la configuration |
|
|
94
|
+
| `vulnreaper login --key <VR-…> [--base-url URL]` | Active une licence et ouvre une session |
|
|
95
|
+
| `vulnreaper logout` | Ferme la session locale |
|
|
96
|
+
| `vulnreaper whoami [--json]` | Affiche licence, rôle, statut, permissions |
|
|
97
|
+
| `vulnreaper admin license\|device\|audit …` | Administration des licences/appareils (rôle `admin`) |
|
|
98
|
+
| `vulnreaper ui` | Shell interactif (REPL conversationnel) |
|
|
99
|
+
|
|
100
|
+
Sans commande, `vulnreaper` ouvre le shell interactif (`ui`).
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Profils de scan
|
|
105
|
+
|
|
106
|
+
| Profil | Usage |
|
|
107
|
+
| --- | --- |
|
|
108
|
+
| `apk-static` *(défaut)* | Analyse statique complète : import, extraction, manifest, dex, natif, Unity, IL2CPP, assets, endpoints, scanners, rapport |
|
|
109
|
+
| `quick` | Version rapide sans extraction ni décompilation |
|
|
110
|
+
| `android-full` | Ajoute apktool, Il2CppDumper et jadx quand ils sont présents |
|
|
111
|
+
| `il2cpp` | Orienté Unity/IL2CPP |
|
|
112
|
+
| `recon` | Reconnaissance endpoints/hosts uniquement |
|
|
113
|
+
| `device` | Énumération des appareils adb |
|
|
114
|
+
| `report-only` | Régénère un rapport à partir de données existantes |
|
|
115
|
+
|
|
116
|
+
Lister les profils : `vulnreaper profiles`.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Outils externes (optionnels)
|
|
121
|
+
|
|
122
|
+
VulnReaper fonctionne sans eux ; s'ils sont présents, il en tire parti :
|
|
123
|
+
|
|
124
|
+
| Outil | Rôle |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| `adb` | Énumération d'appareils / interaction device |
|
|
127
|
+
| `apktool` | Décodage des ressources |
|
|
128
|
+
| `jadx` | Décompilation Java |
|
|
129
|
+
| `apksigner` | Vérification de signature |
|
|
130
|
+
| `aapt` | Inspection d'APK |
|
|
131
|
+
| `frida` | Instrumentation dynamique |
|
|
132
|
+
| `il2cppdumper` | Dump IL2CPP (`.cs` reconstruits) |
|
|
133
|
+
| `cpp2il` | Reconstruction IL2CPP alternative |
|
|
134
|
+
| `ghidra` | Analyse native avancée |
|
|
135
|
+
|
|
136
|
+
Statut : `vulnreaper tools`. Chemins explicites et répertoires de recherche se
|
|
137
|
+
définissent dans la configuration (`vulnreaper config show`).
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Structure du dépôt
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
vulnreaper/ paquet principal
|
|
145
|
+
cli/ point d'entrée, shell interactif (REPL), thème + composants
|
|
146
|
+
formats/ parseurs strings, AXML, DEX, ELF, métadonnées IL2CPP
|
|
147
|
+
android/ import APK, modèle manifest, analyse dex/natif, adb
|
|
148
|
+
unity/ il2cpp/ détection moteur + adaptateurs de dump
|
|
149
|
+
web/ découverte et classification d'endpoints
|
|
150
|
+
scanners/ moteur de règles + scanners (secrets, crypto, réseau, natif)
|
|
151
|
+
findings/ modèle Finding + rapports JSON/MD/HTML
|
|
152
|
+
rules/ packs de règles JSON
|
|
153
|
+
config.py workspace.py database.py project.py pipeline.py engine.py tools.py
|
|
154
|
+
tests/ suite pytest + fixtures synthétiques + smoke end-to-end
|
|
155
|
+
docs/ architecture, règles, utilisation
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Tests
|
|
161
|
+
|
|
162
|
+
```bat
|
|
163
|
+
python -m pytest tests/ -q :: cœur Python + UI (164 tests)
|
|
164
|
+
python tests/smoke.py :: scan end-to-end d'un APK synthétique
|
|
165
|
+
cd server && npm test :: API de licence (11 tests, store mémoire)
|
|
166
|
+
cd server && VULNREAPER_E2E=1 npm test :: + E2E CLI ↔ API
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Le smoke construit un APK structurellement valide (manifest AXML compilé, DEX,
|
|
170
|
+
`.so` natif, `global-metadata.dat`) dans un dossier temporaire, exécute le profil
|
|
171
|
+
`quick` et vérifie que le run se termine, écrit les 3 formats de rapport et
|
|
172
|
+
produit findings et endpoints.
|
|
173
|
+
|
|
174
|
+
Le test E2E inter-stack pilote réellement la CLI contre l'API de licence
|
|
175
|
+
(activation, `whoami`, gating, révocation). Détail de la couverture et
|
|
176
|
+
prérequis : **[docs/TESTING.md](docs/TESTING.md)**.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Documentation
|
|
181
|
+
|
|
182
|
+
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — conception et flux de données
|
|
183
|
+
- [`docs/USAGE.md`](docs/USAGE.md) — prise en main et workflow bug-bounty
|
|
184
|
+
- [`docs/UI.md`](docs/UI.md) — interface CLI/REPL (thème, composants, raccourcis)
|
|
185
|
+
- [`docs/RULES.md`](docs/RULES.md) — packs de règles et écriture de règles
|
|
186
|
+
- [`docs/BETA_TESTERS.md`](docs/BETA_TESTERS.md) — guide des testeurs bêta (npm, licence, gating)
|
|
187
|
+
- [`docs/TESTING.md`](docs/TESTING.md) — stratégie et couverture des tests
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Licence et usage
|
|
192
|
+
|
|
193
|
+
> Distribution sous licence nominative propriétaire. L'utilisation du logiciel
|
|
194
|
+
> vaut acceptation du [contrat de licence utilisateur final (EULA)](LICENSE).
|
|
195
|
+
> Le guide d'activation et le détail des permissions se trouvent dans
|
|
196
|
+
> [docs/BETA_TESTERS.md](docs/BETA_TESTERS.md).
|
|
197
|
+
|
|
198
|
+
Outil destiné aux professionnels autorisés. Ne scannez que des applications que
|
|
199
|
+
vous êtes autorisé à tester (vos propres cibles, programmes de bug bounty, ou
|
|
200
|
+
cibles explicitement autorisées).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* VulnReaper launcher shim.
|
|
6
|
+
*
|
|
7
|
+
* This thin, auditable entry point only forwards arguments to the VulnReaper
|
|
8
|
+
* core (native binary or Python). It intentionally performs NO security
|
|
9
|
+
* decision: all authorisation lives server-side.
|
|
10
|
+
*/
|
|
11
|
+
require('../lib/cli.js').run(process.argv.slice(2));
|
package/lib/cli.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { spawn } = require('node:child_process');
|
|
4
|
+
const { resolveCore } = require('./resolve-core.js');
|
|
5
|
+
|
|
6
|
+
function run(argv) {
|
|
7
|
+
let core;
|
|
8
|
+
try {
|
|
9
|
+
core = resolveCore();
|
|
10
|
+
} catch (err) {
|
|
11
|
+
process.stderr.write(String((err && err.message) || err) + '\n');
|
|
12
|
+
process.exitCode = 127;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const child = spawn(core.command, core.args.concat(argv), {
|
|
17
|
+
stdio: 'inherit',
|
|
18
|
+
env: core.env,
|
|
19
|
+
windowsHide: false,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
child.on('error', (err) => {
|
|
23
|
+
process.stderr.write('Failed to start the VulnReaper core: ' + err.message + '\n');
|
|
24
|
+
process.exitCode = 127;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
child.on('exit', (code, signal) => {
|
|
28
|
+
if (signal) {
|
|
29
|
+
process.kill(process.pid, signal);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
process.exitCode = code === null ? 1 : code;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = { run };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Resolve the VulnReaper core executable/runner.
|
|
5
|
+
*
|
|
6
|
+
* Resolution order:
|
|
7
|
+
* 1. VULNREAPER_CORE override (explicit path).
|
|
8
|
+
* 2. Vendored native binary (vendor/bin/<platform>-<arch>/VulnReaper[.exe]).
|
|
9
|
+
* 3. Platform optional-dependency package (@ksl101/vulnreaper-<tag>).
|
|
10
|
+
* 4. Bundled Python source run through a system Python (vendor/ or repo dev).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const fs = require('node:fs');
|
|
14
|
+
const path = require('node:path');
|
|
15
|
+
const { spawnSync } = require('node:child_process');
|
|
16
|
+
|
|
17
|
+
const ROOT = path.join(__dirname, '..');
|
|
18
|
+
const DEP_SCOPE = '@ksl101/vulnreaper';
|
|
19
|
+
|
|
20
|
+
function platformTag() {
|
|
21
|
+
const arch = process.arch === 'ia32' ? 'x86' : process.arch;
|
|
22
|
+
return `${process.platform}-${arch}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function binaryName() {
|
|
26
|
+
return process.platform === 'win32' ? 'VulnReaper.exe' : 'VulnReaper';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function isFile(p) {
|
|
30
|
+
try {
|
|
31
|
+
return fs.statSync(p).isFile();
|
|
32
|
+
} catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function findPython() {
|
|
38
|
+
const candidates = process.platform === 'win32'
|
|
39
|
+
? ['python', 'py', 'python3']
|
|
40
|
+
: ['python3', 'python'];
|
|
41
|
+
for (const exe of candidates) {
|
|
42
|
+
const probe = spawnSync(exe, ['--version'], { stdio: 'ignore' });
|
|
43
|
+
if (probe.status === 0) return exe;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function pythonCore(pkgDir) {
|
|
49
|
+
const env = Object.assign({}, process.env);
|
|
50
|
+
env.PYTHONPATH = pkgDir + (env.PYTHONPATH ? path.delimiter + env.PYTHONPATH : '');
|
|
51
|
+
env.PYTHONUTF8 = '1';
|
|
52
|
+
env.PYTHONIOENCODING = 'utf-8';
|
|
53
|
+
env.PYTHONDONTWRITEBYTECODE = '1';
|
|
54
|
+
const py = findPython();
|
|
55
|
+
if (!py) return null;
|
|
56
|
+
return { command: py, args: ['-m', 'vulnreaper'], env };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function resolveCore() {
|
|
60
|
+
const override = process.env.VULNREAPER_CORE;
|
|
61
|
+
if (override) {
|
|
62
|
+
return { command: override, args: [], env: Object.assign({}, process.env) };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const tag = platformTag();
|
|
66
|
+
|
|
67
|
+
// 2. Vendored native binary.
|
|
68
|
+
const vendored = path.join(ROOT, 'vendor', 'bin', tag, binaryName());
|
|
69
|
+
if (isFile(vendored)) {
|
|
70
|
+
return { command: vendored, args: [], env: Object.assign({}, process.env) };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// 3. Platform package.
|
|
74
|
+
const depName = `${DEP_SCOPE}-${tag}`;
|
|
75
|
+
try {
|
|
76
|
+
const pkgJsonPath = require.resolve(`${depName}/package.json`);
|
|
77
|
+
const pkg = require(pkgJsonPath);
|
|
78
|
+
if (pkg && pkg.core && pkg.core.path) {
|
|
79
|
+
const p = path.resolve(path.dirname(pkgJsonPath), pkg.core.path);
|
|
80
|
+
if (isFile(p)) {
|
|
81
|
+
return { command: p, args: [], env: Object.assign({}, process.env) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
/* platform package not installed - fall through */
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// 4a. Bundled Python source.
|
|
89
|
+
const bundledPkg = path.join(ROOT, 'vendor');
|
|
90
|
+
if (fs.existsSync(path.join(bundledPkg, 'vulnreaper'))) {
|
|
91
|
+
const core = pythonCore(bundledPkg);
|
|
92
|
+
if (core) return core;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 4b. Repository development checkout.
|
|
96
|
+
if (fs.existsSync(path.join(ROOT, 'vulnreaper'))) {
|
|
97
|
+
const core = pythonCore(ROOT);
|
|
98
|
+
if (core) return core;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
throw new Error(
|
|
102
|
+
'VulnReaper core not found for ' + tag + '.\n' +
|
|
103
|
+
' - Install a supported platform package, or\n' +
|
|
104
|
+
' - install Python 3.10+, or\n' +
|
|
105
|
+
' - set VULNREAPER_CORE to the core executable path.'
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
module.exports = { resolveCore, platformTag, binaryName, findPython };
|
package/package.json
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ksl101/vulnreaper",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
|
+
"description": "VulnReaper - authorised security auditing & bug-bounty CLI for Android/Unity/IL2CPP game packages",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"security",
|
|
7
|
+
"bug-bounty",
|
|
8
|
+
"pentest",
|
|
9
|
+
"android",
|
|
10
|
+
"apk",
|
|
11
|
+
"unity",
|
|
12
|
+
"il2cpp",
|
|
13
|
+
"static-analysis",
|
|
14
|
+
"cli"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://github.com/ksl101/vulnreaper",
|
|
17
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
18
|
+
"author": "KSL101",
|
|
19
|
+
"bin": {
|
|
20
|
+
"vulnreaper": "bin/vulnreaper.js",
|
|
21
|
+
"vr": "bin/vulnreaper.js"
|
|
22
|
+
},
|
|
23
|
+
"main": "lib/cli.js",
|
|
24
|
+
"files": [
|
|
25
|
+
"bin/",
|
|
26
|
+
"lib/",
|
|
27
|
+
"vendor/",
|
|
28
|
+
"README.md",
|
|
29
|
+
"LICENSE"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"prepack": "node scripts/npm/pack-core.js"
|
|
36
|
+
},
|
|
37
|
+
"optionalDependencies": {},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""VulnReaper — Android game security research & bug-bounty automation platform.
|
|
2
|
+
|
|
3
|
+
A modular, offline-first toolkit for analysing Android/Unity/IL2CPP game
|
|
4
|
+
packages: APK/DEX/native/IL2CPP parsing, secret and misconfiguration scanning,
|
|
5
|
+
endpoint discovery, and JSON/Markdown/HTML reporting.
|
|
6
|
+
|
|
7
|
+
Design invariants
|
|
8
|
+
-----------------
|
|
9
|
+
* Standard library only (no third-party runtime dependencies).
|
|
10
|
+
* Never fabricate results: a missing external tool is reported as ``missing``
|
|
11
|
+
and its pipeline stage is ``skipped`` — never simulated.
|
|
12
|
+
* Windows-first, POSIX-compatible.
|
|
13
|
+
"""
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
__all__ = ["__version__", "PRODUCT"]
|
|
17
|
+
|
|
18
|
+
__version__ = "0.1.0-beta.1"
|
|
19
|
+
PRODUCT = "VulnReaper"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def version_string() -> str:
|
|
23
|
+
return f"{PRODUCT} {__version__} — Security Research Platform"
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""Platform compatibility helpers.
|
|
2
|
+
|
|
3
|
+
VulnReaper targets Windows first, but keeps POSIX working. This module is the ONLY
|
|
4
|
+
place that should contain platform branching for stdio, console colour, process
|
|
5
|
+
creation flags and default home directories.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import subprocess
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
IS_WINDOWS = os.name == "nt"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def configure_stdio() -> None:
|
|
17
|
+
"""Force UTF-8 on stdin/stdout/stderr.
|
|
18
|
+
|
|
19
|
+
Windows consoles often default to cp1252/cp850 which breaks on Unicode
|
|
20
|
+
findings. ``reconfigure`` is available on Python 3.7+ TextIOWrapper.
|
|
21
|
+
"""
|
|
22
|
+
for name in ("stdout", "stderr", "stdin"):
|
|
23
|
+
stream = getattr(sys, name, None)
|
|
24
|
+
reconfigure = getattr(stream, "reconfigure", None)
|
|
25
|
+
if reconfigure is None:
|
|
26
|
+
continue
|
|
27
|
+
try:
|
|
28
|
+
reconfigure(encoding="utf-8", errors="replace")
|
|
29
|
+
except (ValueError, OSError):
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def enable_virtual_terminal() -> bool:
|
|
34
|
+
"""Enable ANSI escape processing on Windows consoles (Windows 10+).
|
|
35
|
+
|
|
36
|
+
Returns True when colours can be used. On POSIX this is a no-op.
|
|
37
|
+
"""
|
|
38
|
+
if not IS_WINDOWS:
|
|
39
|
+
return True
|
|
40
|
+
try:
|
|
41
|
+
import ctypes
|
|
42
|
+
|
|
43
|
+
kernel32 = ctypes.windll.kernel32 # type: ignore[attr-defined]
|
|
44
|
+
enable_vt = 0x0004 # ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
|
45
|
+
ok = False
|
|
46
|
+
for std_handle in (-11, -12): # STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
|
|
47
|
+
handle = kernel32.GetStdHandle(std_handle)
|
|
48
|
+
if handle in (0, -1):
|
|
49
|
+
continue
|
|
50
|
+
mode = ctypes.c_uint32()
|
|
51
|
+
if kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
|
|
52
|
+
if kernel32.SetConsoleMode(handle, mode.value | enable_vt):
|
|
53
|
+
ok = True
|
|
54
|
+
return ok
|
|
55
|
+
except Exception:
|
|
56
|
+
return False
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def supports_colour() -> bool:
|
|
60
|
+
"""Best-effort decision on whether to emit ANSI colour."""
|
|
61
|
+
if os.environ.get("NO_COLOR"):
|
|
62
|
+
return False
|
|
63
|
+
if os.environ.get("VULNREAPER_FORCE_COLOR"):
|
|
64
|
+
return True
|
|
65
|
+
if not sys.stdout.isatty():
|
|
66
|
+
return False
|
|
67
|
+
return enable_virtual_terminal()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def creation_flags() -> int:
|
|
71
|
+
"""subprocess creation flags: hide console windows on Windows."""
|
|
72
|
+
if IS_WINDOWS:
|
|
73
|
+
return getattr(subprocess, "CREATE_NO_WINDOW", 0)
|
|
74
|
+
return 0
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def default_home() -> str:
|
|
78
|
+
"""Default VulnReaper home directory (config + workspaces)."""
|
|
79
|
+
env = os.environ.get("VULNREAPER_HOME")
|
|
80
|
+
if env:
|
|
81
|
+
return os.path.abspath(os.path.expanduser(env))
|
|
82
|
+
if IS_WINDOWS:
|
|
83
|
+
base = os.environ.get("LOCALAPPDATA") or os.path.expanduser("~")
|
|
84
|
+
return os.path.join(base, "vulnreaper")
|
|
85
|
+
base = os.environ.get("XDG_DATA_HOME") or os.path.join(os.path.expanduser("~"), ".local", "share")
|
|
86
|
+
return os.path.join(base, "vulnreaper")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def executable_names(name: str) -> list[str]:
|
|
90
|
+
"""Candidate executable filenames for a tool on this platform."""
|
|
91
|
+
if IS_WINDOWS:
|
|
92
|
+
return [name + ".exe", name + ".bat", name + ".cmd", name]
|
|
93
|
+
return [name]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def subprocess_env() -> dict:
|
|
97
|
+
"""Environment for child processes: force UTF-8 and unbuffered."""
|
|
98
|
+
env = dict(os.environ)
|
|
99
|
+
env.setdefault("PYTHONIOENCODING", "utf-8")
|
|
100
|
+
env.setdefault("PYTHONUTF8", "1")
|
|
101
|
+
return env
|