@orionscanner/cli 0.1.0

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.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +248 -0
  3. package/assets/logo.png +0 -0
  4. package/bin/orion.js +48 -0
  5. package/docs/API_REFERENCE.md +211 -0
  6. package/docs/ARCHITECTURE.md +183 -0
  7. package/docs/CHANGELOG.md +112 -0
  8. package/docs/CONTRIBUTING.md +157 -0
  9. package/docs/ENGINE_CATALOG.md +87 -0
  10. package/docs/GETTING_STARTED.md +226 -0
  11. package/package.json +48 -0
  12. package/pyproject.toml +16 -0
  13. package/src/orion/__init__.py +0 -0
  14. package/src/orion/__pycache__/__init__.cpython-313.pyc +0 -0
  15. package/src/orion/engine/__init__.py +17 -0
  16. package/src/orion/engine/__pycache__/__init__.cpython-313.pyc +0 -0
  17. package/src/orion/engine/__pycache__/config.cpython-313.pyc +0 -0
  18. package/src/orion/engine/__pycache__/core.cpython-313.pyc +0 -0
  19. package/src/orion/engine/__pycache__/ir.cpython-313.pyc +0 -0
  20. package/src/orion/engine/__pycache__/languages.cpython-313.pyc +0 -0
  21. package/src/orion/engine/__pycache__/registry.cpython-313.pyc +0 -0
  22. package/src/orion/engine/__pycache__/results.cpython-313.pyc +0 -0
  23. package/src/orion/engine/__pycache__/runner.cpython-313.pyc +0 -0
  24. package/src/orion/engine/api_security/__pycache__/engine.cpython-313.pyc +0 -0
  25. package/src/orion/engine/api_security/engine.py +125 -0
  26. package/src/orion/engine/architecture/__pycache__/engine.cpython-313.pyc +0 -0
  27. package/src/orion/engine/architecture/engine.py +463 -0
  28. package/src/orion/engine/authorization/__pycache__/engine.cpython-313.pyc +0 -0
  29. package/src/orion/engine/authorization/engine.py +337 -0
  30. package/src/orion/engine/callgraph/__pycache__/engine.cpython-313.pyc +0 -0
  31. package/src/orion/engine/callgraph/engine.py +236 -0
  32. package/src/orion/engine/cfg/__pycache__/engine.cpython-313.pyc +0 -0
  33. package/src/orion/engine/cfg/engine.py +509 -0
  34. package/src/orion/engine/chaos/__pycache__/engine.cpython-313.pyc +0 -0
  35. package/src/orion/engine/chaos/engine.py +268 -0
  36. package/src/orion/engine/chaos_config/__pycache__/engine.cpython-313.pyc +0 -0
  37. package/src/orion/engine/chaos_config/engine.py +322 -0
  38. package/src/orion/engine/complexity/__pycache__/engine.cpython-313.pyc +0 -0
  39. package/src/orion/engine/complexity/engine.py +144 -0
  40. package/src/orion/engine/compliance/__pycache__/engine.cpython-313.pyc +0 -0
  41. package/src/orion/engine/compliance/engine.py +325 -0
  42. package/src/orion/engine/config.py +41 -0
  43. package/src/orion/engine/config_engine/__pycache__/engine.cpython-313.pyc +0 -0
  44. package/src/orion/engine/config_engine/engine.py +364 -0
  45. package/src/orion/engine/config_validation/__pycache__/engine.cpython-313.pyc +0 -0
  46. package/src/orion/engine/config_validation/engine.py +313 -0
  47. package/src/orion/engine/container/__pycache__/engine.cpython-313.pyc +0 -0
  48. package/src/orion/engine/container/engine.py +546 -0
  49. package/src/orion/engine/contract_probe/__pycache__/engine.cpython-313.pyc +0 -0
  50. package/src/orion/engine/contract_probe/engine.py +316 -0
  51. package/src/orion/engine/core.py +75 -0
  52. package/src/orion/engine/crypto_guard/__pycache__/engine.cpython-313.pyc +0 -0
  53. package/src/orion/engine/crypto_guard/engine.py +134 -0
  54. package/src/orion/engine/data_residency/__pycache__/engine.cpython-313.pyc +0 -0
  55. package/src/orion/engine/data_residency/engine.py +238 -0
  56. package/src/orion/engine/dataflow/__pycache__/engine.cpython-313.pyc +0 -0
  57. package/src/orion/engine/dataflow/engine.py +398 -0
  58. package/src/orion/engine/dead_import/__pycache__/engine.cpython-313.pyc +0 -0
  59. package/src/orion/engine/dead_import/engine.py +293 -0
  60. package/src/orion/engine/deps/__pycache__/engine.cpython-313.pyc +0 -0
  61. package/src/orion/engine/deps/engine.py +244 -0
  62. package/src/orion/engine/dispatcher.py +350 -0
  63. package/src/orion/engine/docs/AUDIT_PROMPT.md +1248 -0
  64. package/src/orion/engine/duplication/__pycache__/engine.cpython-313.pyc +0 -0
  65. package/src/orion/engine/duplication/engine.py +120 -0
  66. package/src/orion/engine/error_handling/__pycache__/engine.cpython-313.pyc +0 -0
  67. package/src/orion/engine/error_handling/engine.py +256 -0
  68. package/src/orion/engine/fp_learn/__pycache__/engine.cpython-313.pyc +0 -0
  69. package/src/orion/engine/fp_learn/engine.py +248 -0
  70. package/src/orion/engine/hunter/__pycache__/engine.cpython-313.pyc +0 -0
  71. package/src/orion/engine/hunter/engine.py +324 -0
  72. package/src/orion/engine/iac_security/__pycache__/engine.cpython-313.pyc +0 -0
  73. package/src/orion/engine/iac_security/engine.py +218 -0
  74. package/src/orion/engine/ir.py +22 -0
  75. package/src/orion/engine/languages.py +454 -0
  76. package/src/orion/engine/license/__pycache__/engine.cpython-313.pyc +0 -0
  77. package/src/orion/engine/license/engine.py +172 -0
  78. package/src/orion/engine/lint/__pycache__/engine.cpython-313.pyc +0 -0
  79. package/src/orion/engine/lint/engine.py +558 -0
  80. package/src/orion/engine/llm_security/__pycache__/engine.cpython-313.pyc +0 -0
  81. package/src/orion/engine/llm_security/engine.py +125 -0
  82. package/src/orion/engine/logging_c/__pycache__/engine.cpython-313.pyc +0 -0
  83. package/src/orion/engine/logging_c/engine.py +164 -0
  84. package/src/orion/engine/noise/__pycache__/engine.cpython-313.pyc +0 -0
  85. package/src/orion/engine/noise/engine.py +140 -0
  86. package/src/orion/engine/orphan/__pycache__/engine.cpython-313.pyc +0 -0
  87. package/src/orion/engine/orphan/engine.py +244 -0
  88. package/src/orion/engine/perf_guard/__pycache__/engine.cpython-313.pyc +0 -0
  89. package/src/orion/engine/perf_guard/engine.py +345 -0
  90. package/src/orion/engine/prompt_security/__pycache__/engine.cpython-313.pyc +0 -0
  91. package/src/orion/engine/prompt_security/detectors/__init__.py +4 -0
  92. package/src/orion/engine/prompt_security/engine.py +170 -0
  93. package/src/orion/engine/provenance/__pycache__/engine.cpython-313.pyc +0 -0
  94. package/src/orion/engine/provenance/engine.py +242 -0
  95. package/src/orion/engine/registry.py +55 -0
  96. package/src/orion/engine/regression/__pycache__/engine.cpython-313.pyc +0 -0
  97. package/src/orion/engine/regression/engine.py +213 -0
  98. package/src/orion/engine/results.py +21 -0
  99. package/src/orion/engine/runner.py +1310 -0
  100. package/src/orion/engine/sandbox_escape/__pycache__/engine.cpython-313.pyc +0 -0
  101. package/src/orion/engine/sandbox_escape/engine.py +284 -0
  102. package/src/orion/engine/sast/__pycache__/engine.cpython-313.pyc +0 -0
  103. package/src/orion/engine/sast/engine.py +217 -0
  104. package/src/orion/engine/sast/patterns/__init__.py +513 -0
  105. package/src/orion/engine/sast/patterns/__pycache__/__init__.cpython-313.pyc +0 -0
  106. package/src/orion/engine/secrets/__pycache__/engine.cpython-313.pyc +0 -0
  107. package/src/orion/engine/secrets/engine.py +77 -0
  108. package/src/orion/engine/secrets/patterns/__init__.py +74 -0
  109. package/src/orion/engine/secrets/patterns/__pycache__/__init__.cpython-313.pyc +0 -0
  110. package/src/orion/engine/sensitive_data/__pycache__/engine.cpython-313.pyc +0 -0
  111. package/src/orion/engine/sensitive_data/engine.py +143 -0
  112. package/src/orion/engine/state/__pycache__/engine.cpython-313.pyc +0 -0
  113. package/src/orion/engine/state/engine.py +218 -0
  114. package/src/orion/engine/supply_chain_sbom/__pycache__/engine.cpython-313.pyc +0 -0
  115. package/src/orion/engine/supply_chain_sbom/engine.py +290 -0
  116. package/src/orion/engine/symbol/__pycache__/engine.cpython-313.pyc +0 -0
  117. package/src/orion/engine/symbol/engine.py +463 -0
  118. package/src/orion/engine/taint/__pycache__/engine.cpython-313.pyc +0 -0
  119. package/src/orion/engine/taint/engine.py +464 -0
  120. package/src/orion/engine/test_coverage/__pycache__/engine.cpython-313.pyc +0 -0
  121. package/src/orion/engine/test_coverage/engine.py +445 -0
  122. package/src/orion/engine/threat_model/__pycache__/engine.cpython-313.pyc +0 -0
  123. package/src/orion/engine/threat_model/engine.py +126 -0
  124. package/src/orion/engine/wiring_trace/__pycache__/engine.cpython-313.pyc +0 -0
  125. package/src/orion/engine/wiring_trace/engine.py +200 -0
  126. package/src/orion_engine.egg-info/PKG-INFO +7 -0
  127. package/src/orion_engine.egg-info/SOURCES.txt +65 -0
  128. package/src/orion_engine.egg-info/dependency_links.txt +1 -0
  129. package/src/orion_engine.egg-info/entry_points.txt +2 -0
  130. package/src/orion_engine.egg-info/top_level.txt +1 -0
@@ -0,0 +1,200 @@
1
+ """Config wiring trace engine - trace config from source to usage."""
2
+ import re
3
+ import os
4
+ import json
5
+ import ast
6
+ from pathlib import Path
7
+ from orion.engine.config import EngineConfig
8
+ from orion.engine.ir import OrionIR
9
+ from orion.engine.results import EngineResult, Finding
10
+
11
+
12
+ class Engine:
13
+ name = "wiring_trace"
14
+ version = "1.0.0"
15
+
16
+ CONFIG_FILES = {
17
+ ".env", "config.yaml", "config.yml", "settings.py", "settings.json",
18
+ "appsettings.json", "application.properties", "application.yml",
19
+ "config.toml", "config.ini", "secrets.yaml", "secrets.yml"
20
+ }
21
+
22
+ ENV_ACCESS_PATTERNS = [
23
+ (r"os\.getenv\s*\(\s*['\"]([^'\"]+)['\"]", "os.getenv"),
24
+ (r"os\.environ\.get\s*\(\s*['\"]([^'\"]+)['\"]", "os.environ.get"),
25
+ (r"os\.environ\s*\[\s*['\"]([^'\"]+)['\"]\s*\]", "os.environ[]"),
26
+ (r"config\s*\(\s*['\"]([^'\"]+)['\"]", "config()"),
27
+ (r"settings\.\w+", "settings."),
28
+ (r"environ\s*\[\s*['\"]([^'\"]+)['\"]", "environ[]"),
29
+ (r"getenv\s*\(\s*['\"]([^'\"]+)['\"]", "getenv()"),
30
+ ]
31
+
32
+ SECRET_KEY_PATTERNS = [
33
+ r"(?i)(password|secret|key|token|api.?key|access.?key|private.?key)",
34
+ r"(?i)(db.?password|database.?password|db.?secret)",
35
+ r"(?i)(jwt.?secret|session.?secret|cookie.?secret)",
36
+ r"(?i)(aws.?secret|aws.?access.?key)",
37
+ r"(?i)(github.?token|gitlab.?token|slack.?token)",
38
+ ]
39
+
40
+ async def check_availability(self) -> bool:
41
+ return True
42
+
43
+ def resource_limits(self):
44
+ from orion.engine.config import ResourceLimits
45
+ return ResourceLimits(max_cpu_seconds=60, max_memory_mb=256)
46
+
47
+ async def run(self, ir: OrionIR, config: EngineConfig) -> EngineResult:
48
+ try:
49
+ text = ir.content.decode("utf-8", errors="replace")
50
+ except Exception:
51
+ text = str(ir.content)
52
+
53
+ path = ir.metadata.get("path", "unknown")
54
+ filename = Path(path).name
55
+ findings = []
56
+
57
+ if filename in self.CONFIG_FILES:
58
+ config_keys = self._parse_config_file(text, filename)
59
+ if config_keys:
60
+ findings.append(Finding(
61
+ engine=self.name,
62
+ severity="info",
63
+ title=f"Config source detected: {filename}",
64
+ description=f"Found {len(config_keys)} configuration keys in {filename}",
65
+ location=path,
66
+ metadata={
67
+ "confidence": 1.0,
68
+ "config_keys": list(config_keys.keys()),
69
+ "source_type": filename,
70
+ },
71
+ ))
72
+
73
+ env_keys = self._find_env_access(text)
74
+ for key, pattern in env_keys:
75
+ line_no = text[:text.find(key)].count("\n") + 1 if key in text else 1
76
+ findings.append(Finding(
77
+ engine=self.name,
78
+ severity="info",
79
+ title=f"Environment variable access: {key}",
80
+ description=f"Code accesses environment variable '{key}' via {pattern}",
81
+ location=f"{path}:{line_no}",
82
+ metadata={
83
+ "confidence": 0.9,
84
+ "config_key": key,
85
+ "access_method": pattern,
86
+ "source": "code",
87
+ },
88
+ ))
89
+
90
+ if filename.endswith(".py"):
91
+ hardcoded = self._find_hardcoded_secrets(text, path)
92
+ findings.extend(hardcoded)
93
+
94
+ return EngineResult(engine=self.name, findings=findings, ok=True)
95
+
96
+ def _parse_config_file(self, text: str, filename: str) -> dict:
97
+ keys = {}
98
+ if filename == ".env":
99
+ for line in text.splitlines():
100
+ line = line.strip()
101
+ if line and not line.startswith("#") and "=" in line:
102
+ key, val = line.split("=", 1)
103
+ keys[key.strip()] = val.strip().strip('"\'')
104
+ elif filename.endswith(".json"):
105
+ try:
106
+ data = json.loads(text)
107
+ keys = self._flatten_dict(data)
108
+ except Exception:
109
+ pass
110
+ elif filename.endswith((".yaml", ".yml")):
111
+ keys = self._parse_yaml_simple(text)
112
+ elif filename.endswith(".toml"):
113
+ try:
114
+ import tomllib
115
+ data = tomllib.loads(text)
116
+ keys = self._flatten_dict(data)
117
+ except Exception:
118
+ pass
119
+ elif filename.endswith(".properties"):
120
+ for line in text.splitlines():
121
+ line = line.strip()
122
+ if line and not line.startswith("#") and "=" in line:
123
+ key, val = line.split("=", 1)
124
+ keys[key.strip()] = val.strip()
125
+ elif filename.endswith(".py"):
126
+ try:
127
+ tree = ast.parse(text)
128
+ for node in ast.walk(tree):
129
+ if isinstance(node, ast.Assign):
130
+ for target in node.targets:
131
+ if isinstance(target, ast.Name) and target.id.isupper():
132
+ if isinstance(node.value, ast.Constant):
133
+ keys[target.id] = str(node.value.value)
134
+ except Exception:
135
+ pass
136
+ return keys
137
+
138
+ def _parse_yaml_simple(self, text: str) -> dict:
139
+ keys = {}
140
+ indent_stack = []
141
+ for line in text.splitlines():
142
+ if not line.strip() or line.strip().startswith("#"):
143
+ continue
144
+ indent = len(line) - len(line.lstrip())
145
+ while indent_stack and indent_stack[-1][0] >= indent:
146
+ indent_stack.pop()
147
+ match = re.match(r"^(\s*)([^:]+):\s*(.*)$", line)
148
+ if match:
149
+ key = match.group(2).strip()
150
+ value = match.group(3).strip().strip('"\'')
151
+ prefix = ".".join([x[1] for x in indent_stack]) if indent_stack else ""
152
+ full_key = f"{prefix}.{key}" if prefix else key
153
+ keys[full_key] = value
154
+ indent_stack.append((indent, key))
155
+ return keys
156
+
157
+ def _flatten_dict(self, d: dict, prefix: str = "") -> dict:
158
+ result = {}
159
+ for k, v in d.items():
160
+ new_key = f"{prefix}.{k}" if prefix else k
161
+ if isinstance(v, dict):
162
+ result.update(self._flatten_dict(v, new_key))
163
+ else:
164
+ result[new_key] = v
165
+ return result
166
+
167
+ def _find_env_access(self, text: str) -> list:
168
+ results = []
169
+ for pattern, method in self.ENV_ACCESS_PATTERNS:
170
+ for match in re.finditer(pattern, text):
171
+ key = match.group(1)
172
+ results.append((key, method))
173
+ return results
174
+
175
+ def _find_hardcoded_secrets(self, text: str, path: str):
176
+ findings = []
177
+ lines = text.splitlines()
178
+
179
+ for i, line in enumerate(lines):
180
+ for pattern in self.SECRET_KEY_PATTERNS:
181
+ match = re.search(pattern, line)
182
+ if match:
183
+ if re.search(r"=\s*['\"][^'\"]{8,}['\"]", line):
184
+ if not re.search(r"os\.(getenv|environ)|config\(|settings\.", line):
185
+ findings.append(Finding(
186
+ engine=self.name,
187
+ severity="high",
188
+ title=f"Hardcoded secret value detected",
189
+ description=f"Possible hardcoded secret matching pattern '{match.group(1)}' without config reference",
190
+ location=f"{path}:{i+1}",
191
+ metadata={
192
+ "confidence": 0.8,
193
+ "snippet": line.strip()[:200],
194
+ "pattern": match.group(1),
195
+ "issue": "hardcoded_secret",
196
+ "cwe": "CWE-798",
197
+ "cvss": 7.5,
198
+ },
199
+ ))
200
+ return findings
@@ -0,0 +1,7 @@
1
+ Metadata-Version: 2.4
2
+ Name: orion-engine
3
+ Version: 0.1.0
4
+ Summary: Orion Security Suite - Proprietary In-House Code Intelligence & Security Audit Platform
5
+ Requires-Python: >=3.10
6
+ License-File: LICENSE
7
+ Dynamic: license-file
@@ -0,0 +1,65 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ src/orion/__init__.py
5
+ src/orion/engine/__init__.py
6
+ src/orion/engine/config.py
7
+ src/orion/engine/core.py
8
+ src/orion/engine/dispatcher.py
9
+ src/orion/engine/ir.py
10
+ src/orion/engine/languages.py
11
+ src/orion/engine/registry.py
12
+ src/orion/engine/results.py
13
+ src/orion/engine/runner.py
14
+ src/orion/engine/api_security/engine.py
15
+ src/orion/engine/architecture/engine.py
16
+ src/orion/engine/authorization/engine.py
17
+ src/orion/engine/callgraph/engine.py
18
+ src/orion/engine/cfg/engine.py
19
+ src/orion/engine/chaos/engine.py
20
+ src/orion/engine/chaos_config/engine.py
21
+ src/orion/engine/complexity/engine.py
22
+ src/orion/engine/compliance/engine.py
23
+ src/orion/engine/config_engine/engine.py
24
+ src/orion/engine/config_validation/engine.py
25
+ src/orion/engine/container/engine.py
26
+ src/orion/engine/contract_probe/engine.py
27
+ src/orion/engine/crypto_guard/engine.py
28
+ src/orion/engine/data_residency/engine.py
29
+ src/orion/engine/dataflow/engine.py
30
+ src/orion/engine/dead_import/engine.py
31
+ src/orion/engine/deps/engine.py
32
+ src/orion/engine/duplication/engine.py
33
+ src/orion/engine/error_handling/engine.py
34
+ src/orion/engine/fp_learn/engine.py
35
+ src/orion/engine/hunter/engine.py
36
+ src/orion/engine/iac_security/engine.py
37
+ src/orion/engine/license/engine.py
38
+ src/orion/engine/lint/engine.py
39
+ src/orion/engine/llm_security/engine.py
40
+ src/orion/engine/logging_c/engine.py
41
+ src/orion/engine/noise/engine.py
42
+ src/orion/engine/orphan/engine.py
43
+ src/orion/engine/perf_guard/engine.py
44
+ src/orion/engine/prompt_security/engine.py
45
+ src/orion/engine/prompt_security/detectors/__init__.py
46
+ src/orion/engine/provenance/engine.py
47
+ src/orion/engine/regression/engine.py
48
+ src/orion/engine/sandbox_escape/engine.py
49
+ src/orion/engine/sast/engine.py
50
+ src/orion/engine/sast/patterns/__init__.py
51
+ src/orion/engine/secrets/engine.py
52
+ src/orion/engine/secrets/patterns/__init__.py
53
+ src/orion/engine/sensitive_data/engine.py
54
+ src/orion/engine/state/engine.py
55
+ src/orion/engine/supply_chain_sbom/engine.py
56
+ src/orion/engine/symbol/engine.py
57
+ src/orion/engine/taint/engine.py
58
+ src/orion/engine/test_coverage/engine.py
59
+ src/orion/engine/threat_model/engine.py
60
+ src/orion/engine/wiring_trace/engine.py
61
+ src/orion_engine.egg-info/PKG-INFO
62
+ src/orion_engine.egg-info/SOURCES.txt
63
+ src/orion_engine.egg-info/dependency_links.txt
64
+ src/orion_engine.egg-info/entry_points.txt
65
+ src/orion_engine.egg-info/top_level.txt
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ orion = orion.engine.runner:main
@@ -0,0 +1 @@
1
+ orion