kollabor 0.4.9__py3-none-any.whl → 0.4.15__py3-none-any.whl
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.
- agents/__init__.py +2 -0
- agents/coder/__init__.py +0 -0
- agents/coder/agent.json +4 -0
- agents/coder/api-integration.md +2150 -0
- agents/coder/cli-pretty.md +765 -0
- agents/coder/code-review.md +1092 -0
- agents/coder/database-design.md +1525 -0
- agents/coder/debugging.md +1102 -0
- agents/coder/dependency-management.md +1397 -0
- agents/coder/git-workflow.md +1099 -0
- agents/coder/refactoring.md +1454 -0
- agents/coder/security-hardening.md +1732 -0
- agents/coder/system_prompt.md +1448 -0
- agents/coder/tdd.md +1367 -0
- agents/creative-writer/__init__.py +0 -0
- agents/creative-writer/agent.json +4 -0
- agents/creative-writer/character-development.md +1852 -0
- agents/creative-writer/dialogue-craft.md +1122 -0
- agents/creative-writer/plot-structure.md +1073 -0
- agents/creative-writer/revision-editing.md +1484 -0
- agents/creative-writer/system_prompt.md +690 -0
- agents/creative-writer/worldbuilding.md +2049 -0
- agents/data-analyst/__init__.py +30 -0
- agents/data-analyst/agent.json +4 -0
- agents/data-analyst/data-visualization.md +992 -0
- agents/data-analyst/exploratory-data-analysis.md +1110 -0
- agents/data-analyst/pandas-data-manipulation.md +1081 -0
- agents/data-analyst/sql-query-optimization.md +881 -0
- agents/data-analyst/statistical-analysis.md +1118 -0
- agents/data-analyst/system_prompt.md +928 -0
- agents/default/__init__.py +0 -0
- agents/default/agent.json +4 -0
- agents/default/dead-code.md +794 -0
- agents/default/explore-agent-system.md +585 -0
- agents/default/system_prompt.md +1448 -0
- agents/kollabor/__init__.py +0 -0
- agents/kollabor/analyze-plugin-lifecycle.md +175 -0
- agents/kollabor/analyze-terminal-rendering.md +388 -0
- agents/kollabor/code-review.md +1092 -0
- agents/kollabor/debug-mcp-integration.md +521 -0
- agents/kollabor/debug-plugin-hooks.md +547 -0
- agents/kollabor/debugging.md +1102 -0
- agents/kollabor/dependency-management.md +1397 -0
- agents/kollabor/git-workflow.md +1099 -0
- agents/kollabor/inspect-llm-conversation.md +148 -0
- agents/kollabor/monitor-event-bus.md +558 -0
- agents/kollabor/profile-performance.md +576 -0
- agents/kollabor/refactoring.md +1454 -0
- agents/kollabor/system_prompt copy.md +1448 -0
- agents/kollabor/system_prompt.md +757 -0
- agents/kollabor/trace-command-execution.md +178 -0
- agents/kollabor/validate-config.md +879 -0
- agents/research/__init__.py +0 -0
- agents/research/agent.json +4 -0
- agents/research/architecture-mapping.md +1099 -0
- agents/research/codebase-analysis.md +1077 -0
- agents/research/dependency-audit.md +1027 -0
- agents/research/performance-profiling.md +1047 -0
- agents/research/security-review.md +1359 -0
- agents/research/system_prompt.md +492 -0
- agents/technical-writer/__init__.py +0 -0
- agents/technical-writer/agent.json +4 -0
- agents/technical-writer/api-documentation.md +2328 -0
- agents/technical-writer/changelog-management.md +1181 -0
- agents/technical-writer/readme-writing.md +1360 -0
- agents/technical-writer/style-guide.md +1410 -0
- agents/technical-writer/system_prompt.md +653 -0
- agents/technical-writer/tutorial-creation.md +1448 -0
- core/__init__.py +0 -2
- core/application.py +343 -88
- core/cli.py +229 -10
- core/commands/menu_renderer.py +463 -59
- core/commands/registry.py +14 -9
- core/commands/system_commands.py +2461 -14
- core/config/loader.py +151 -37
- core/config/service.py +18 -6
- core/events/bus.py +29 -9
- core/events/executor.py +205 -75
- core/events/models.py +27 -8
- core/fullscreen/command_integration.py +20 -24
- core/fullscreen/components/__init__.py +10 -1
- core/fullscreen/components/matrix_components.py +1 -2
- core/fullscreen/components/space_shooter_components.py +654 -0
- core/fullscreen/plugin.py +5 -0
- core/fullscreen/renderer.py +52 -13
- core/fullscreen/session.py +52 -15
- core/io/__init__.py +29 -5
- core/io/buffer_manager.py +6 -1
- core/io/config_status_view.py +7 -29
- core/io/core_status_views.py +267 -347
- core/io/input/__init__.py +25 -0
- core/io/input/command_mode_handler.py +711 -0
- core/io/input/display_controller.py +128 -0
- core/io/input/hook_registrar.py +286 -0
- core/io/input/input_loop_manager.py +421 -0
- core/io/input/key_press_handler.py +502 -0
- core/io/input/modal_controller.py +1011 -0
- core/io/input/paste_processor.py +339 -0
- core/io/input/status_modal_renderer.py +184 -0
- core/io/input_errors.py +5 -1
- core/io/input_handler.py +211 -2452
- core/io/key_parser.py +7 -0
- core/io/layout.py +15 -3
- core/io/message_coordinator.py +111 -2
- core/io/message_renderer.py +129 -4
- core/io/status_renderer.py +147 -607
- core/io/terminal_renderer.py +97 -51
- core/io/terminal_state.py +21 -4
- core/io/visual_effects.py +816 -165
- core/llm/agent_manager.py +1063 -0
- core/llm/api_adapters/__init__.py +44 -0
- core/llm/api_adapters/anthropic_adapter.py +432 -0
- core/llm/api_adapters/base.py +241 -0
- core/llm/api_adapters/openai_adapter.py +326 -0
- core/llm/api_communication_service.py +167 -113
- core/llm/conversation_logger.py +322 -16
- core/llm/conversation_manager.py +556 -30
- core/llm/file_operations_executor.py +84 -32
- core/llm/llm_service.py +934 -103
- core/llm/mcp_integration.py +541 -57
- core/llm/message_display_service.py +135 -18
- core/llm/plugin_sdk.py +1 -2
- core/llm/profile_manager.py +1183 -0
- core/llm/response_parser.py +274 -56
- core/llm/response_processor.py +16 -3
- core/llm/tool_executor.py +6 -1
- core/logging/__init__.py +2 -0
- core/logging/setup.py +34 -6
- core/models/resume.py +54 -0
- core/plugins/__init__.py +4 -2
- core/plugins/base.py +127 -0
- core/plugins/collector.py +23 -161
- core/plugins/discovery.py +37 -3
- core/plugins/factory.py +6 -12
- core/plugins/registry.py +5 -17
- core/ui/config_widgets.py +128 -28
- core/ui/live_modal_renderer.py +2 -1
- core/ui/modal_actions.py +5 -0
- core/ui/modal_overlay_renderer.py +0 -60
- core/ui/modal_renderer.py +268 -7
- core/ui/modal_state_manager.py +29 -4
- core/ui/widgets/base_widget.py +7 -0
- core/updates/__init__.py +10 -0
- core/updates/version_check_service.py +348 -0
- core/updates/version_comparator.py +103 -0
- core/utils/config_utils.py +685 -526
- core/utils/plugin_utils.py +1 -1
- core/utils/session_naming.py +111 -0
- fonts/LICENSE +21 -0
- fonts/README.md +46 -0
- fonts/SymbolsNerdFont-Regular.ttf +0 -0
- fonts/SymbolsNerdFontMono-Regular.ttf +0 -0
- fonts/__init__.py +44 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/METADATA +54 -4
- kollabor-0.4.15.dist-info/RECORD +228 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/top_level.txt +2 -0
- plugins/agent_orchestrator/__init__.py +39 -0
- plugins/agent_orchestrator/activity_monitor.py +181 -0
- plugins/agent_orchestrator/file_attacher.py +77 -0
- plugins/agent_orchestrator/message_injector.py +135 -0
- plugins/agent_orchestrator/models.py +48 -0
- plugins/agent_orchestrator/orchestrator.py +403 -0
- plugins/agent_orchestrator/plugin.py +976 -0
- plugins/agent_orchestrator/xml_parser.py +191 -0
- plugins/agent_orchestrator_plugin.py +9 -0
- plugins/enhanced_input/box_styles.py +1 -0
- plugins/enhanced_input/color_engine.py +19 -4
- plugins/enhanced_input/config.py +2 -2
- plugins/enhanced_input_plugin.py +61 -11
- plugins/fullscreen/__init__.py +6 -2
- plugins/fullscreen/example_plugin.py +1035 -222
- plugins/fullscreen/setup_wizard_plugin.py +592 -0
- plugins/fullscreen/space_shooter_plugin.py +131 -0
- plugins/hook_monitoring_plugin.py +436 -78
- plugins/query_enhancer_plugin.py +66 -30
- plugins/resume_conversation_plugin.py +1494 -0
- plugins/save_conversation_plugin.py +98 -32
- plugins/system_commands_plugin.py +70 -56
- plugins/tmux_plugin.py +154 -78
- plugins/workflow_enforcement_plugin.py +94 -92
- system_prompt/default.md +952 -886
- core/io/input_mode_manager.py +0 -402
- core/io/modal_interaction_handler.py +0 -315
- core/io/raw_input_processor.py +0 -946
- core/storage/__init__.py +0 -5
- core/storage/state_manager.py +0 -84
- core/ui/widget_integration.py +0 -222
- core/utils/key_reader.py +0 -171
- kollabor-0.4.9.dist-info/RECORD +0 -128
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/WHEEL +0 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/entry_points.txt +0 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,1359 @@
|
|
|
1
|
+
<!-- Security Review skill - identify vulnerabilities without modifying code -->
|
|
2
|
+
|
|
3
|
+
security-review mode: OBSERVE AND REPORT ONLY
|
|
4
|
+
|
|
5
|
+
when this skill is active, you follow security investigation discipline.
|
|
6
|
+
this is a comprehensive guide to identifying security vulnerabilities.
|
|
7
|
+
you DO NOT fix vulnerabilities - you report them for the coder agent.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
PHASE 0: SECURITY TOOLKIT VERIFICATION
|
|
11
|
+
|
|
12
|
+
before conducting ANY security review, verify your analysis tools are ready.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
check for static analysis tools
|
|
16
|
+
|
|
17
|
+
<terminal>which bandit 2>/dev/null || echo "bandit not installed"</terminal>
|
|
18
|
+
<terminal>which safety 2>/dev/null || echo "safety not installed"</terminal>
|
|
19
|
+
<terminal>which semgrep 2>/dev/null || echo "semgrep not installed"</terminal>
|
|
20
|
+
<terminal>which pylint 2>/dev/null || echo "pylint not installed"</terminal>
|
|
21
|
+
|
|
22
|
+
if tools not installed:
|
|
23
|
+
<terminal>pip install bandit safety semgrep pylint --quiet</terminal>
|
|
24
|
+
|
|
25
|
+
verify installation:
|
|
26
|
+
<terminal>bandit --version</terminal>
|
|
27
|
+
<terminal>safety --version</terminal>
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
check for security scanning tools
|
|
31
|
+
|
|
32
|
+
<terminal>which trivy 2>/dev/null || echo "trivy not installed"</terminal>
|
|
33
|
+
<terminal>which grype 2>/dev/null || echo "grype not installed"</terminal>
|
|
34
|
+
<terminal>which snyk 2>/dev/null || echo "snyk not installed"</terminal>
|
|
35
|
+
|
|
36
|
+
these are optional but helpful for dependency scanning.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
check for dependency audit tools
|
|
40
|
+
|
|
41
|
+
<terminal>pip show pip-audit 2>/dev/null || echo "pip-audit not installed"</terminal>
|
|
42
|
+
<terminal>pip show setuptools 2>/dev/null | grep Version || echo "setuptools not found"</terminal>
|
|
43
|
+
|
|
44
|
+
if pip-audit not installed:
|
|
45
|
+
<terminal>pip install pip-audit --quiet</terminal>
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
check project structure
|
|
49
|
+
|
|
50
|
+
<terminal>ls -la</terminal>
|
|
51
|
+
<terminal>find . -name "*.py" -type f | head -20</terminal>
|
|
52
|
+
<terminal>find . -name "requirements*.txt" -o -name "pyproject.toml" -o -name "setup.py" 2>/dev/null</terminal>
|
|
53
|
+
|
|
54
|
+
identify:
|
|
55
|
+
- python source files
|
|
56
|
+
- dependency files
|
|
57
|
+
- configuration files
|
|
58
|
+
- entry points
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
check for existing security configs
|
|
62
|
+
|
|
63
|
+
<terminal>ls -la .bandit 2>/dev/null || echo "no .bandit config"</terminal>
|
|
64
|
+
<terminal>cat .semgrepignore 2>/dev/null || echo "no .semgrepignore"</terminal>
|
|
65
|
+
<terminal>cat pyproject.toml 2>/dev/null | grep -A10 "\[tool.bandit\]" || echo "no bandit config in pyproject.toml"</terminal>
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
verify baseline scan can run
|
|
69
|
+
|
|
70
|
+
<terminal>bandit -r . -f json -o /tmp/bandit_baseline.json 2>&1 | head -5</terminal>
|
|
71
|
+
|
|
72
|
+
if bandit fails, identify issues:
|
|
73
|
+
- syntax errors in code (report separately)
|
|
74
|
+
- missing dependencies (note for analysis)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
PHASE 1: ATTACK SURFACE MAPPING
|
|
78
|
+
|
|
79
|
+
before diving into code, understand what youre reviewing.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
identify application entry points
|
|
83
|
+
|
|
84
|
+
<terminal>find . -name "main.py" -o -name "app.py" -o -name "__main__.py" 2>/dev/null</terminal>
|
|
85
|
+
<terminal>find . -name "manage.py" -o -name "wsgi.py" -o -name "asgi.py" 2>/dev/null</terminal>
|
|
86
|
+
<terminal>grep -r "if __name__" --include="*.py" . 2>/dev/null | head -10</terminal>
|
|
87
|
+
|
|
88
|
+
entry points to examine:
|
|
89
|
+
- CLI argument parsers
|
|
90
|
+
- web server startup
|
|
91
|
+
- API route definitions
|
|
92
|
+
- socket bindings
|
|
93
|
+
- file watchers
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
identify input sources
|
|
97
|
+
|
|
98
|
+
<read><file>path/to/main.py</file></read>
|
|
99
|
+
|
|
100
|
+
look for:
|
|
101
|
+
- command line arguments (argparse, click, typer)
|
|
102
|
+
- environment variables (os.environ, os.getenv)
|
|
103
|
+
- file reads (open(), pathlib.read_text)
|
|
104
|
+
- network input (socket, http, api)
|
|
105
|
+
- database queries (user-provided data)
|
|
106
|
+
- stdin/stdout operations
|
|
107
|
+
|
|
108
|
+
document all input sources in your report.
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
identify data flow
|
|
112
|
+
|
|
113
|
+
<terminal>grep -r "request\." --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
114
|
+
<terminal>grep -r "input(" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
115
|
+
<terminal>grep -r "sys.argv" --include="*.py" . 2>/dev/null | head -10</terminal>
|
|
116
|
+
|
|
117
|
+
trace how data moves through the application:
|
|
118
|
+
- where does input enter?
|
|
119
|
+
- how is it validated?
|
|
120
|
+
- where does it get used?
|
|
121
|
+
- does it leave the application?
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
identify authentication mechanisms
|
|
125
|
+
|
|
126
|
+
<terminal>grep -r "login\|auth\|token\|jwt\|session" --include="*.py" -i . 2>/dev/null | head -30</terminal>
|
|
127
|
+
<terminal>grep -r "password\|credential\|secret\|api_key" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
128
|
+
|
|
129
|
+
look for:
|
|
130
|
+
- authentication implementations
|
|
131
|
+
- session management
|
|
132
|
+
- token handling
|
|
133
|
+
- password storage
|
|
134
|
+
- multi-factor auth
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
identify external integrations
|
|
138
|
+
|
|
139
|
+
<terminal>grep -r "requests\." --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
140
|
+
<terminal>grep -r "import http\|import urllib\|import aiohttp" --include="*.py" . 2>/dev/null</terminal>
|
|
141
|
+
<terminal>grep -r "\.execute\|\.query" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
142
|
+
|
|
143
|
+
external systems:
|
|
144
|
+
- HTTP/API calls
|
|
145
|
+
- database connections
|
|
146
|
+
- message queues
|
|
147
|
+
- file system operations
|
|
148
|
+
- third-party services
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
PHASE 2: INJECTION VULNERABILITIES
|
|
152
|
+
|
|
153
|
+
injection is the #1 OWASP vulnerability category. look for it everywhere.
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
SQL injection patterns
|
|
157
|
+
|
|
158
|
+
<terminal>grep -rn "execute.*%.*format" --include="*.py" . 2>/dev/null</terminal>
|
|
159
|
+
<terminal>grep -rn "execute.*+" --include="*.py" . 2>/dev/null | grep -E "(SELECT|INSERT|UPDATE|DELETE)"</terminal>
|
|
160
|
+
<terminal>grep -rn "f\".*SELECT.*{" --include="*.py" . 2>/dev/null</terminal>
|
|
161
|
+
|
|
162
|
+
vulnerable patterns:
|
|
163
|
+
- string concatenation in queries
|
|
164
|
+
- f-strings with user input in queries
|
|
165
|
+
- .format() with user input in queries
|
|
166
|
+
- % formatting with user input in queries
|
|
167
|
+
|
|
168
|
+
example vulnerable code:
|
|
169
|
+
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
|
|
170
|
+
|
|
171
|
+
example safe code:
|
|
172
|
+
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
|
|
173
|
+
|
|
174
|
+
document all occurrences with file and line number.
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
command injection patterns
|
|
178
|
+
|
|
179
|
+
<terminal>grep -rn "os.system\|subprocess.call" --include="*.py" . 2>/dev/null</terminal>
|
|
180
|
+
<terminal>grep -rn "subprocess.*shell=True" --include="*.py" . 2>/dev/null</terminal>
|
|
181
|
+
<terminal>grep -rn "Popen.*shell" --include="*.py" . 2>/dev/null</terminal>
|
|
182
|
+
|
|
183
|
+
dangerous functions:
|
|
184
|
+
- os.system()
|
|
185
|
+
- subprocess.call() with shell=True
|
|
186
|
+
- subprocess.Popen() with shell=True
|
|
187
|
+
- commands.getoutput()
|
|
188
|
+
- popen2()
|
|
189
|
+
|
|
190
|
+
vulnerable patterns:
|
|
191
|
+
- user input in command string
|
|
192
|
+
- unvalidated filenames in commands
|
|
193
|
+
- shell metacharacters not escaped
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
code injection patterns
|
|
197
|
+
|
|
198
|
+
<terminal>grep -rn "eval(" --include="*.py" . 2>/dev/null</terminal>
|
|
199
|
+
<terminal>grep -rn "exec(" --include="*.py" . 2>/dev/null</terminal>
|
|
200
|
+
<terminal>grep -rn "__import__.*%.*format" --include="*.py" . 2>/dev/null</terminal>
|
|
201
|
+
|
|
202
|
+
extremely dangerous:
|
|
203
|
+
- eval() with user input
|
|
204
|
+
- exec() with user input
|
|
205
|
+
- compile() with user input
|
|
206
|
+
- dynamic imports with user input
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
template injection patterns
|
|
210
|
+
|
|
211
|
+
<terminal>grep -rn "render_template_string\|Jinja2.*from_string" --include="*.py" . 2>/dev/null</terminal>
|
|
212
|
+
|
|
213
|
+
look for:
|
|
214
|
+
- template rendering from strings
|
|
215
|
+
- user-controlled template content
|
|
216
|
+
- format strings with user input
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
LDAP injection patterns
|
|
220
|
+
|
|
221
|
+
<terminal>grep -rn "ldap.search\|ldap.query" --include="*.py" -i . 2>/dev/null</terminal>
|
|
222
|
+
|
|
223
|
+
vulnerable: constructing LDAP queries with user input.
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
XXE injection patterns
|
|
227
|
+
|
|
228
|
+
<terminal>grep -rn "xml.etree\|lxml\|minidom" --include="*.py" . 2>/dev/null</terminal>
|
|
229
|
+
|
|
230
|
+
dangerous parsers:
|
|
231
|
+
- xml.etree.ElementTree (disable DTD)
|
|
232
|
+
- lxml.etree (disable DTD)
|
|
233
|
+
- xml.dom.minidom (vulnerable)
|
|
234
|
+
|
|
235
|
+
check for DTD/entity processing enabled.
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
path injection patterns
|
|
239
|
+
|
|
240
|
+
<terminal>grep -rn "open(.*%\|open(.*format\|open(.*f\"" --include="*.py" . 2>/dev/null</terminal>
|
|
241
|
+
<terminal>grep -rn "Path(.*%.*format\|Path(.*f\"" --include="*.py" . 2>/dev/null</terminal>
|
|
242
|
+
|
|
243
|
+
vulnerabilities:
|
|
244
|
+
- path traversal (../)
|
|
245
|
+
- arbitrary file access
|
|
246
|
+
- directory escape
|
|
247
|
+
|
|
248
|
+
check for path sanitization.
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
PHASE 3: AUTHENTICATION AND AUTHORIZATION
|
|
252
|
+
|
|
253
|
+
auth issues are #2 on OWASP - examine them carefully.
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
password handling
|
|
257
|
+
|
|
258
|
+
<terminal>grep -rn "password.*==" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
259
|
+
<terminal>grep -rn "password.*=.*f\"\|password.*=.*format" --include="*.py" -i . 2>/dev/null</terminal>
|
|
260
|
+
<terminal>grep -rn "md5\|sha1" --include="*.py" . 2>/dev/null | grep -i pass</terminal>
|
|
261
|
+
|
|
262
|
+
look for:
|
|
263
|
+
- plain text password storage
|
|
264
|
+
- weak hashing (MD5, SHA1)
|
|
265
|
+
- password in logs/error messages
|
|
266
|
+
- password in URL/query params
|
|
267
|
+
- password comparison without timing-safe compare
|
|
268
|
+
|
|
269
|
+
safe password handling:
|
|
270
|
+
- bcrypt, scrypt, argon2
|
|
271
|
+
- timing-safe comparison
|
|
272
|
+
- never log passwords
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
session management
|
|
276
|
+
|
|
277
|
+
<terminal>grep -rn "session\[" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
278
|
+
<terminal>grep -rn "cookie\[" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
279
|
+
<terminal>grep -rn "set_cookie\|get_cookie" --include="*.py" . 2>/dev/null</terminal>
|
|
280
|
+
|
|
281
|
+
check for:
|
|
282
|
+
- session fixation (no regeneration after login)
|
|
283
|
+
- missing secure/httponly flags
|
|
284
|
+
- session timeout configuration
|
|
285
|
+
- session ID predictability
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
token handling
|
|
289
|
+
|
|
290
|
+
<terminal>grep -rn "jwt\|token\|bearer" --include="*.py" -i . 2>/dev/null | head -30</terminal>
|
|
291
|
+
<terminal>grep -rn "decode.*jwt\|verify.*jwt" --include="*.py" -i . 2>/dev/null</terminal>
|
|
292
|
+
|
|
293
|
+
look for:
|
|
294
|
+
- JWT without signature verification
|
|
295
|
+
- JWT with weak secret
|
|
296
|
+
- JWT in URL
|
|
297
|
+
- token not checked for expiration
|
|
298
|
+
- token reuse vulnerabilities
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
authentication bypass patterns
|
|
302
|
+
|
|
303
|
+
<terminal>grep -rn "or.*1.*=.*1" --include="*.py" . 2>/dev/null</terminal>
|
|
304
|
+
<terminal>grep -rn "if.*auth.*and.*is.*None\|if.*auth.*==.*None" --include="*.py" . 2>/dev/null</terminal>
|
|
305
|
+
|
|
306
|
+
look for:
|
|
307
|
+
- logic errors in auth checks
|
|
308
|
+
- missing auth on certain endpoints
|
|
309
|
+
- admin bypass opportunities
|
|
310
|
+
- authentication skipping in debug mode
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
authorization checks
|
|
314
|
+
|
|
315
|
+
<terminal>grep -rn "@admin\|@login_required\|@require_auth" --include="*.py" . 2>/dev/null</terminal>
|
|
316
|
+
<terminal>grep -rn "if.*admin\|if.*role.*==" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
317
|
+
|
|
318
|
+
check for:
|
|
319
|
+
- missing authorization on sensitive operations
|
|
320
|
+
- role-based access control issues
|
|
321
|
+
- horizontal privilege escalation (accessing other users data)
|
|
322
|
+
- vertical privilege escalation (privilege elevation)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
multi-factor authentication
|
|
326
|
+
|
|
327
|
+
<terminal>grep -rn "mfa\|2fa\|totp\|otp" --include="*.py" -i . 2>/dev/null</terminal>
|
|
328
|
+
|
|
329
|
+
if MFA exists, check:
|
|
330
|
+
- OTP verification logic
|
|
331
|
+
- backup code handling
|
|
332
|
+
- MFA bypass possibilities
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
PHASE 4: CRYPTOGRAPHY ISSUES
|
|
336
|
+
|
|
337
|
+
bad crypto breaks everything. examine carefully.
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
hardcoded secrets
|
|
341
|
+
|
|
342
|
+
<terminal>grep -rn "password.*=.*\"\|secret.*=.*\"\|api_key.*=.*\"" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
343
|
+
<terminal>grep -rn "SECRET\|PASSWORD\|API_KEY\|TOKEN" --include="*.py" . 2>/dev/null | grep -E "= [\"']" | head -20</terminal>
|
|
344
|
+
|
|
345
|
+
secrets to find:
|
|
346
|
+
- API keys
|
|
347
|
+
- database passwords
|
|
348
|
+
- JWT secrets
|
|
349
|
+
- encryption keys
|
|
350
|
+
- OAuth tokens
|
|
351
|
+
- private keys
|
|
352
|
+
|
|
353
|
+
check:
|
|
354
|
+
- source code
|
|
355
|
+
- config files
|
|
356
|
+
- example files
|
|
357
|
+
- environment variable defaults
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
weak algorithms
|
|
361
|
+
|
|
362
|
+
<terminal>grep -rn "import.*hashlib.*md5\|from hashlib import md5" --include="*.py" . 2>/dev/null</terminal>
|
|
363
|
+
<terminal>grep -rn "import.*hashlib.*sha1\|from hashlib import sha1" --include="*.py" . 2>/dev/null</terminal>
|
|
364
|
+
<terminal>grep -rn "Crypto.Cipher.ARC4\|ARC4\|RC4" --include="*.py" . 2>/dev/null</terminal>
|
|
365
|
+
|
|
366
|
+
weak algorithms:
|
|
367
|
+
- MD5, SHA1 for crypto purposes
|
|
368
|
+
- RC4, DES, triple DES
|
|
369
|
+
- ECB mode
|
|
370
|
+
- custom crypto implementations
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
random number generation
|
|
374
|
+
|
|
375
|
+
<terminal>grep -rn "import random" --include="*.py" . 2>/dev/null</terminal>
|
|
376
|
+
<terminal>grep -rn "random\.random\|random\.randint\|random\.choice" --include="*.py" . 2>/dev/null | grep -E "(token|key|salt|password|nonce)"</terminal>
|
|
377
|
+
|
|
378
|
+
for crypto, use:
|
|
379
|
+
- secrets.token_bytes()
|
|
380
|
+
- secrets.token_urlsafe()
|
|
381
|
+
- os.urandom()
|
|
382
|
+
- SystemRandom
|
|
383
|
+
|
|
384
|
+
NOT:
|
|
385
|
+
- random module (predictable)
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
TLS/SSL configuration
|
|
389
|
+
|
|
390
|
+
<terminal>grep -rn "ssl\|tls\|https\|cert" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
391
|
+
<terminal>grep -rn "verify=False\|ssl._create_default_context" --include="*.py" . 2>/dev/null</terminal>
|
|
392
|
+
|
|
393
|
+
look for:
|
|
394
|
+
- disabled certificate verification
|
|
395
|
+
- weak TLS versions
|
|
396
|
+
- missing hostname verification
|
|
397
|
+
- self-signed certs in production
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
key management
|
|
401
|
+
|
|
402
|
+
<terminal>grep -rn "private.*key\|\.pem\|\.key" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
403
|
+
|
|
404
|
+
check:
|
|
405
|
+
- key storage location
|
|
406
|
+
- key rotation
|
|
407
|
+
- key strength
|
|
408
|
+
- hardening of key material
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
PHASE 5: DATA VALIDATION
|
|
412
|
+
|
|
413
|
+
all input must be validated. all of it.
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
input validation
|
|
417
|
+
|
|
418
|
+
<terminal>grep -rn "@app.route\|@router\|@bp.route" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
419
|
+
|
|
420
|
+
for each route, check:
|
|
421
|
+
- type validation
|
|
422
|
+
- length limits
|
|
423
|
+
- format validation
|
|
424
|
+
- range checks
|
|
425
|
+
- allowed values (whitelist vs blacklist)
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
output encoding
|
|
429
|
+
|
|
430
|
+
<terminal>grep -rn "render_template\|return.*html\|HttpResponse" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
431
|
+
|
|
432
|
+
check for:
|
|
433
|
+
- XSS vulnerabilities
|
|
434
|
+
- unescaped output
|
|
435
|
+
- HTML/JS injection
|
|
436
|
+
- user input reflected in responses
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
file upload validation
|
|
440
|
+
|
|
441
|
+
<terminal>grep -rn "upload\|FileStorage\|save.*upload" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
442
|
+
|
|
443
|
+
look for:
|
|
444
|
+
- file type validation
|
|
445
|
+
- file size limits
|
|
446
|
+
- file name sanitization
|
|
447
|
+
- storage location (web accessible?)
|
|
448
|
+
- malware scanning
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
deserialization
|
|
452
|
+
|
|
453
|
+
<terminal>grep -rn "pickle\|marshal\|shelve" --include="*.py" . 2>/dev/null</terminal>
|
|
454
|
+
<terminal>grep -rn "yaml.load\|yaml.unsafe_load" --include="*.py" . 2>/dev/null</terminal>
|
|
455
|
+
|
|
456
|
+
dangerous:
|
|
457
|
+
- pickle.loads() with untrusted data
|
|
458
|
+
- yaml.load() without Loader=SafeLoader
|
|
459
|
+
- json.loads() with object_hook
|
|
460
|
+
- msgpack.unpackb() with raw=True
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
type confusion
|
|
464
|
+
|
|
465
|
+
<terminal>grep -rn "int(input\|float(input" --include="*.py" . 2>/dev/null</terminal>
|
|
466
|
+
|
|
467
|
+
check for:
|
|
468
|
+
- unchecked type conversions
|
|
469
|
+
- integer overflow potential
|
|
470
|
+
- float precision issues
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
PHASE 6: SECURITY MISCONFIGURATION
|
|
474
|
+
|
|
475
|
+
default configs are often insecure.
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
framework security settings
|
|
479
|
+
|
|
480
|
+
<read><file>path/to/config.py</file></read>
|
|
481
|
+
<read><file>path/to/settings.py</file></read>
|
|
482
|
+
<read><file>path/to/app.py</file></read>
|
|
483
|
+
|
|
484
|
+
check:
|
|
485
|
+
- DEBUG mode in production
|
|
486
|
+
- test mode enabled
|
|
487
|
+
- verbose error messages
|
|
488
|
+
- default credentials
|
|
489
|
+
- CORS configuration
|
|
490
|
+
- HSTS enabled
|
|
491
|
+
- CSP headers
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
dependency vulnerabilities
|
|
495
|
+
|
|
496
|
+
<terminal>pip-audit 2>&1 | tee /tmp/pip_audit_results.txt</terminal>
|
|
497
|
+
<terminal>safety check --json 2>&1 | tee /tmp/safety_results.txt</terminal>
|
|
498
|
+
|
|
499
|
+
document:
|
|
500
|
+
- known vulnerable packages
|
|
501
|
+
- severity levels
|
|
502
|
+
- available patches
|
|
503
|
+
- transitive dependencies
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
logging and monitoring
|
|
507
|
+
|
|
508
|
+
<terminal>grep -rn "logging\|logger\|print(" --include="*.py" . 2>/dev/null | grep -E "(password|secret|token|key)" | head -10</terminal>
|
|
509
|
+
|
|
510
|
+
check:
|
|
511
|
+
- sensitive data in logs
|
|
512
|
+
- log injection
|
|
513
|
+
- security event logging
|
|
514
|
+
- audit trail
|
|
515
|
+
- log access controls
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
error handling
|
|
519
|
+
|
|
520
|
+
<terminal>grep -rn "except.*:" --include="*.py" . 2>/dev/null | head -30</terminal>
|
|
521
|
+
<terminal>grep -rn "raise.*Exception\|raise.*Error" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
522
|
+
|
|
523
|
+
look for:
|
|
524
|
+
- stack traces exposed to users
|
|
525
|
+
- information leakage in errors
|
|
526
|
+
- generic vs specific error messages
|
|
527
|
+
- error handling that bypasses security
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
PHASE 7: SENSITIVE DATA EXPOSURE
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
data in transit
|
|
534
|
+
|
|
535
|
+
<terminal>grep -rn "http://\|ws://\|ftp://" --include="*.py" . 2>/dev/null | grep -v "localhost\|127.0.0.1"</terminal>
|
|
536
|
+
|
|
537
|
+
check:
|
|
538
|
+
- HTTPS everywhere
|
|
539
|
+
- TLS configuration
|
|
540
|
+
- certificate validation
|
|
541
|
+
- sensitive data over HTTP
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
data at rest
|
|
545
|
+
|
|
546
|
+
<terminal>grep -rn "database\|db\|sqlite\|postgres" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
547
|
+
|
|
548
|
+
check:
|
|
549
|
+
- database encryption
|
|
550
|
+
- file system encryption
|
|
551
|
+
- backup security
|
|
552
|
+
- data retention
|
|
553
|
+
- secure deletion
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
data in use
|
|
557
|
+
|
|
558
|
+
check:
|
|
559
|
+
- memory leaks of sensitive data
|
|
560
|
+
- swap file exposure
|
|
561
|
+
- core dump exposure
|
|
562
|
+
- debugger access
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
cache exposure
|
|
566
|
+
|
|
567
|
+
<terminal>grep -rn "cache\|redis\|memcached" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
568
|
+
|
|
569
|
+
check:
|
|
570
|
+
- sensitive data in cache
|
|
571
|
+
- cache authentication
|
|
572
|
+
- cache encryption
|
|
573
|
+
- cache key naming
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
PHASE 8: BUSINESS LOGIC VULNERABILITIES
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
abuse cases
|
|
580
|
+
|
|
581
|
+
think like an attacker:
|
|
582
|
+
- can I manipulate prices?
|
|
583
|
+
- can I bypass payment?
|
|
584
|
+
- can I exploit race conditions?
|
|
585
|
+
- can I exceed rate limits?
|
|
586
|
+
- can I manipulate workflows?
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
financial vulnerabilities
|
|
590
|
+
|
|
591
|
+
look for:
|
|
592
|
+
- price manipulation
|
|
593
|
+
- payment bypass
|
|
594
|
+
- double spending
|
|
595
|
+
- negative quantities
|
|
596
|
+
- coupon abuse
|
|
597
|
+
- refund abuse
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
authorization bypass
|
|
601
|
+
|
|
602
|
+
<terminal>grep -rn "if.*user\.id\|if.*request\.user" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
603
|
+
|
|
604
|
+
check:
|
|
605
|
+
- direct object reference
|
|
606
|
+
- IDOR (insecure direct object reference)
|
|
607
|
+
- missing ownership checks
|
|
608
|
+
- workflow bypass
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
race conditions
|
|
612
|
+
|
|
613
|
+
<terminal>grep -rn "async\|thread\|concurrent" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
614
|
+
|
|
615
|
+
look for:
|
|
616
|
+
- check-then-act patterns
|
|
617
|
+
- state changes without locks
|
|
618
|
+
- concurrent access issues
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
PHASE 9: API SECURITY
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
authentication
|
|
625
|
+
|
|
626
|
+
check API endpoints for:
|
|
627
|
+
- missing authentication
|
|
628
|
+
- weak token generation
|
|
629
|
+
- no rate limiting
|
|
630
|
+
- key in URL
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
authorization
|
|
634
|
+
|
|
635
|
+
<terminal>grep -rn "@require_auth\|@authenticate" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
636
|
+
|
|
637
|
+
check:
|
|
638
|
+
- endpoint protection
|
|
639
|
+
- role-based access
|
|
640
|
+
- resource ownership
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
input validation
|
|
644
|
+
|
|
645
|
+
APIs need strict validation:
|
|
646
|
+
- type checking
|
|
647
|
+
- length limits
|
|
648
|
+
- format validation
|
|
649
|
+
- range checks
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
output handling
|
|
653
|
+
|
|
654
|
+
<terminal>grep -rn "return.*json\|JsonResponse\|jsonify" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
655
|
+
|
|
656
|
+
check:
|
|
657
|
+
- information leakage
|
|
658
|
+
- detailed error messages
|
|
659
|
+
- stack traces
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
rate limiting
|
|
663
|
+
|
|
664
|
+
<terminal>grep -rn "@limiter\|rate_limit\|@ratelimit" --include="*.py" -i . 2>/dev/null</terminal>
|
|
665
|
+
|
|
666
|
+
check:
|
|
667
|
+
- rate limiting implementation
|
|
668
|
+
- limits per endpoint
|
|
669
|
+
- different limits for auth vs non-auth
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
versioning
|
|
673
|
+
|
|
674
|
+
check:
|
|
675
|
+
- API versioning strategy
|
|
676
|
+
- deprecated versions
|
|
677
|
+
- breaking changes
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
PHASE 10: FILE SYSTEM SECURITY
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
file operations
|
|
684
|
+
|
|
685
|
+
<terminal>grep -rn "open(\|Path(\|read_text(\|write_text(" --include="*.py" . 2>/dev/null | head -30</terminal>
|
|
686
|
+
|
|
687
|
+
check:
|
|
688
|
+
- path traversal vulnerabilities
|
|
689
|
+
- symbolic link handling
|
|
690
|
+
- race conditions (TOCTOU)
|
|
691
|
+
- permission checks
|
|
692
|
+
|
|
693
|
+
|
|
694
|
+
temporary files
|
|
695
|
+
|
|
696
|
+
<terminal>grep -rn "tempfile\|mktemp\|NamedTemporaryFile" --include="*.py" . 2>/dev/null</terminal>
|
|
697
|
+
|
|
698
|
+
check:
|
|
699
|
+
- secure temp file creation
|
|
700
|
+
- temp file permissions
|
|
701
|
+
- temp file cleanup
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
file permissions
|
|
705
|
+
|
|
706
|
+
<terminal>grep -rn "chmod\|chown\|umask" --include="*.py" . 2>/dev/null</terminal>
|
|
707
|
+
|
|
708
|
+
check:
|
|
709
|
+
- default file permissions
|
|
710
|
+
- sensitive file permissions
|
|
711
|
+
- umask settings
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
PHASE 11: NETWORK SECURITY
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
network services
|
|
718
|
+
|
|
719
|
+
<terminal>grep -rn "bind\|listen\|socket\|server" --include="*.py" -i . 2>/dev/null | head -20</terminal>
|
|
720
|
+
|
|
721
|
+
check:
|
|
722
|
+
- binding to all interfaces (0.0.0.0)
|
|
723
|
+
- unnecessary open ports
|
|
724
|
+
- services exposed to internet
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
HTTP security
|
|
728
|
+
|
|
729
|
+
<terminal>grep -rn "http.server\|flask\|fastapi\|django" --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
730
|
+
|
|
731
|
+
check headers:
|
|
732
|
+
- Security headers
|
|
733
|
+
- CORS configuration
|
|
734
|
+
- HSTS
|
|
735
|
+
- X-Frame-Options
|
|
736
|
+
- Content-Security-Policy
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
websocket security
|
|
740
|
+
|
|
741
|
+
<terminal>grep -rn "websocket\|socketio\|ws://" --include="*.py" -i . 2>/dev/null | head -10</terminal>
|
|
742
|
+
|
|
743
|
+
check:
|
|
744
|
+
- authentication on ws
|
|
745
|
+
- origin validation
|
|
746
|
+
- message rate limiting
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
PHASE 12: DEPENDENCY VULNERABILITIES
|
|
750
|
+
|
|
751
|
+
|
|
752
|
+
transitive dependencies
|
|
753
|
+
|
|
754
|
+
<terminal>pip install pipdeptree --quiet</terminal>
|
|
755
|
+
<terminal>pipdeptree 2>&1 | tee /tmp/dependency_tree.txt</terminal>
|
|
756
|
+
|
|
757
|
+
map full dependency tree.
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
known vulnerabilities
|
|
761
|
+
|
|
762
|
+
<terminal>pip-audit --desc 2>&1 | tee /tmp/vuln_report.txt</terminal>
|
|
763
|
+
|
|
764
|
+
document each vulnerability with:
|
|
765
|
+
- CVE identifier
|
|
766
|
+
- severity
|
|
767
|
+
- affected version
|
|
768
|
+
- fix version
|
|
769
|
+
- exploitability
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
outdated packages
|
|
773
|
+
|
|
774
|
+
<terminal>pip list --outdated 2>&1 | tee /tmp/outdated.txt</terminal>
|
|
775
|
+
|
|
776
|
+
check:
|
|
777
|
+
- security updates available
|
|
778
|
+
- critical updates
|
|
779
|
+
- end-of-life packages
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
unused dependencies
|
|
783
|
+
|
|
784
|
+
<terminal>pip install pip-autoremove --quiet</terminal>
|
|
785
|
+
<terminal>pip-autoremove --dry-run 2>&1</terminal>
|
|
786
|
+
|
|
787
|
+
fewer dependencies = smaller attack surface.
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
PHASE 13: CODE QUALITY SECURITY ISSUES
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
use of dangerous functions
|
|
794
|
+
|
|
795
|
+
<terminal>grep -rn "\\binput\\(" --include="*.py" . 2>/dev/null</terminal>
|
|
796
|
+
<terminal>grep -rn "\\beval\\(" --include="*.py" . 2>/dev/null</terminal>
|
|
797
|
+
<terminal>grep -rn "\\bexec\\(" --include="*.py" . 2>/dev/null</terminal>
|
|
798
|
+
|
|
799
|
+
dangerous:
|
|
800
|
+
- input() in Python 2 (raw_input is safer, but still)
|
|
801
|
+
- eval() - code execution
|
|
802
|
+
- exec() - code execution
|
|
803
|
+
- compile() - code generation
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
assertion usage
|
|
807
|
+
|
|
808
|
+
<terminal>grep -rn "assert " --include="*.py" . 2>/dev/null | head -20</terminal>
|
|
809
|
+
|
|
810
|
+
note: assertions are disabled with -O flag
|
|
811
|
+
- dont use assertions for security checks
|
|
812
|
+
- they can be compiled out
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
exception handling
|
|
816
|
+
|
|
817
|
+
<terminal>grep -rn "except:" --include="*.py" . 2>/dev/null</terminal>
|
|
818
|
+
<terminal>grep -rn "except.*Exception.*:" --include="*.py" . 2>/dev/null</terminal>
|
|
819
|
+
|
|
820
|
+
bare excepts can hide security issues.
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
PHASE 14: RUNNING SECURITY SCANS
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
automated scan with bandit
|
|
827
|
+
|
|
828
|
+
<terminal>bandit -r . -f json -o /tmp/bandit_report.json 2>&1</terminal>
|
|
829
|
+
<terminal>bandit -r . -f txt -o /tmp/bandit_report.txt 2>&1</terminal>
|
|
830
|
+
|
|
831
|
+
review results:
|
|
832
|
+
- high severity issues
|
|
833
|
+
- medium severity issues
|
|
834
|
+
- low severity issues
|
|
835
|
+
- confidence levels
|
|
836
|
+
|
|
837
|
+
|
|
838
|
+
automated scan with semgrep
|
|
839
|
+
|
|
840
|
+
<terminal>semgrep --config auto --json --output=/tmp/semgrep_report.json . 2>&1</terminal>
|
|
841
|
+
|
|
842
|
+
semgrep rules for security:
|
|
843
|
+
- python.security
|
|
844
|
+
- python.lang.security
|
|
845
|
+
- custom security rules
|
|
846
|
+
|
|
847
|
+
|
|
848
|
+
static analysis with pylint
|
|
849
|
+
|
|
850
|
+
<terminal>pylint --enable=all --output-format=json . 2>&1 > /tmp/pylint_report.json || true</terminal>
|
|
851
|
+
|
|
852
|
+
look for:
|
|
853
|
+
- dangerous-default-value
|
|
854
|
+
- eval-used
|
|
855
|
+
- exec-used
|
|
856
|
+
- uncontrolled迭代
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
dependency audit
|
|
860
|
+
|
|
861
|
+
<terminal>safety check --json --output /tmp/safety_report.json 2>&1</terminal>
|
|
862
|
+
<terminal>pip-audit --format json --output /tmp/pip_audit_report.json 2>&1</terminal>
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
container security (if applicable)
|
|
866
|
+
|
|
867
|
+
<terminal>which trivy && trivy fs --format json --output /tmp/trivy_report.json . 2>/dev/null || echo "trivy not available"</terminal>
|
|
868
|
+
|
|
869
|
+
check for:
|
|
870
|
+
- vulnerable base images
|
|
871
|
+
- exposed secrets in image
|
|
872
|
+
- unnecessary packages
|
|
873
|
+
|
|
874
|
+
|
|
875
|
+
PHASE 15: REPORTING VULNERABILITIES
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
vulnerability report template
|
|
879
|
+
|
|
880
|
+
for each vulnerability found, document:
|
|
881
|
+
|
|
882
|
+
vuln_id: VULN-001
|
|
883
|
+
title: [short description]
|
|
884
|
+
severity: [critical|high|medium|low|info]
|
|
885
|
+
category: [injection|auth|crypto|config|etc]
|
|
886
|
+
cwe: [CWE identifier if applicable]
|
|
887
|
+
owasp: [OWASP category if applicable]
|
|
888
|
+
|
|
889
|
+
location:
|
|
890
|
+
file: [path to file]
|
|
891
|
+
line: [line number]
|
|
892
|
+
function: [function name]
|
|
893
|
+
|
|
894
|
+
description:
|
|
895
|
+
[what the vulnerability is]
|
|
896
|
+
|
|
897
|
+
proof of concept:
|
|
898
|
+
[how to reproduce or demonstrate]
|
|
899
|
+
|
|
900
|
+
impact:
|
|
901
|
+
[what an attacker could do]
|
|
902
|
+
|
|
903
|
+
remediation:
|
|
904
|
+
[how to fix - detailed steps]
|
|
905
|
+
|
|
906
|
+
references:
|
|
907
|
+
[links to relevant documentation]
|
|
908
|
+
|
|
909
|
+
example vulnerable code:
|
|
910
|
+
[code snippet]
|
|
911
|
+
|
|
912
|
+
example secure code:
|
|
913
|
+
[fixed code snippet]
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
severity classification
|
|
917
|
+
|
|
918
|
+
critical:
|
|
919
|
+
- remote code execution
|
|
920
|
+
- SQL injection
|
|
921
|
+
- authentication bypass
|
|
922
|
+
- hard-coded admin credentials
|
|
923
|
+
|
|
924
|
+
high:
|
|
925
|
+
- XSS
|
|
926
|
+
- CSRF
|
|
927
|
+
- sensitive data exposure
|
|
928
|
+
- weak crypto
|
|
929
|
+
- command injection
|
|
930
|
+
|
|
931
|
+
medium:
|
|
932
|
+
- security misconfiguration
|
|
933
|
+
- missing rate limiting
|
|
934
|
+
- incomplete input validation
|
|
935
|
+
- information disclosure
|
|
936
|
+
|
|
937
|
+
low:
|
|
938
|
+
- best practices
|
|
939
|
+
- minor security improvements
|
|
940
|
+
- defense in depth opportunities
|
|
941
|
+
|
|
942
|
+
|
|
943
|
+
report structure
|
|
944
|
+
|
|
945
|
+
security review report
|
|
946
|
+
=====================
|
|
947
|
+
|
|
948
|
+
executive summary:
|
|
949
|
+
- total vulnerabilities found
|
|
950
|
+
- breakdown by severity
|
|
951
|
+
- critical issues requiring immediate attention
|
|
952
|
+
|
|
953
|
+
methodology:
|
|
954
|
+
- tools used
|
|
955
|
+
- scope of review
|
|
956
|
+
- limitations
|
|
957
|
+
|
|
958
|
+
findings:
|
|
959
|
+
- grouped by category
|
|
960
|
+
- ordered by severity
|
|
961
|
+
|
|
962
|
+
recommendations:
|
|
963
|
+
- prioritized action items
|
|
964
|
+
- quick wins vs long-term improvements
|
|
965
|
+
|
|
966
|
+
appendix:
|
|
967
|
+
- full scan results
|
|
968
|
+
- dependency vulnerability report
|
|
969
|
+
- detailed code references
|
|
970
|
+
|
|
971
|
+
|
|
972
|
+
PHASE 16: SECURITY REVIEW CHECKLIST
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
authentication and authorization
|
|
976
|
+
|
|
977
|
+
[ ] password storage uses strong hashing (bcrypt/scrypt/argon2)
|
|
978
|
+
[ ] no hardcoded credentials
|
|
979
|
+
[ ] session management is secure
|
|
980
|
+
[ ] tokens expire and are verified
|
|
981
|
+
[ ] MFA implemented where appropriate
|
|
982
|
+
[ ] authorization checks on all sensitive operations
|
|
983
|
+
[ ] no privilege escalation paths
|
|
984
|
+
[ ] rate limiting on auth endpoints
|
|
985
|
+
|
|
986
|
+
|
|
987
|
+
input validation and output encoding
|
|
988
|
+
|
|
989
|
+
[ ] all input is validated
|
|
990
|
+
[ ] type checking enforced
|
|
991
|
+
[ ] length limits enforced
|
|
992
|
+
[ ] dangerous characters sanitized
|
|
993
|
+
[ ] output is properly encoded
|
|
994
|
+
[ ] parameterized queries used
|
|
995
|
+
[ ] no user input in commands
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
cryptography
|
|
999
|
+
|
|
1000
|
+
[ ] strong algorithms used
|
|
1001
|
+
[ ] proper key management
|
|
1002
|
+
[ ] secrets not in code
|
|
1003
|
+
[ ] random generation uses secure source
|
|
1004
|
+
[ ] TLS configured correctly
|
|
1005
|
+
[ ] certificates validated
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
data protection
|
|
1009
|
+
|
|
1010
|
+
[ ] data encrypted in transit
|
|
1011
|
+
[ ] sensitive data encrypted at rest
|
|
1012
|
+
[ ] no sensitive data in logs
|
|
1013
|
+
[ ] no sensitive data in error messages
|
|
1014
|
+
[ ] secure data deletion
|
|
1015
|
+
[ ] backup encryption
|
|
1016
|
+
|
|
1017
|
+
|
|
1018
|
+
configuration
|
|
1019
|
+
|
|
1020
|
+
[ ] debug mode off in production
|
|
1021
|
+
[ ] secure defaults
|
|
1022
|
+
[ ] least privilege principle
|
|
1023
|
+
[ ] security headers enabled
|
|
1024
|
+
[ ] CORS properly configured
|
|
1025
|
+
[ ] no test data in production
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
dependencies
|
|
1029
|
+
|
|
1030
|
+
[ ] no known vulnerable packages
|
|
1031
|
+
[ ] dependencies up to date
|
|
1032
|
+
[ ] transitive dependencies audited
|
|
1033
|
+
[ ] unnecessary packages removed
|
|
1034
|
+
|
|
1035
|
+
|
|
1036
|
+
error handling and logging
|
|
1037
|
+
|
|
1038
|
+
[ ] no stack traces to users
|
|
1039
|
+
[ ] security events logged
|
|
1040
|
+
[ ] log injection prevented
|
|
1041
|
+
[ ] appropriate error messages
|
|
1042
|
+
[ ] audit trail maintained
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
api security
|
|
1046
|
+
|
|
1047
|
+
[ ] authentication on all endpoints
|
|
1048
|
+
[ ] proper authorization checks
|
|
1049
|
+
[ ] rate limiting configured
|
|
1050
|
+
[ ] input validation on all parameters
|
|
1051
|
+
[ ] secure response headers
|
|
1052
|
+
[ ] API versioning
|
|
1053
|
+
|
|
1054
|
+
|
|
1055
|
+
file system
|
|
1056
|
+
|
|
1057
|
+
[ ] path traversal prevented
|
|
1058
|
+
[ ] file upload validation
|
|
1059
|
+
[ ] secure temp file handling
|
|
1060
|
+
[ ] proper file permissions
|
|
1061
|
+
[ ] no TOCTOU vulnerabilities
|
|
1062
|
+
|
|
1063
|
+
|
|
1064
|
+
PHASE 17: COMMON VULNERABILITY PATTERNS
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
pattern 1: user input in SQL query
|
|
1068
|
+
|
|
1069
|
+
vulnerable:
|
|
1070
|
+
query = f"SELECT * FROM users WHERE name = '{username}'"
|
|
1071
|
+
|
|
1072
|
+
indicators:
|
|
1073
|
+
- f-strings with SQL
|
|
1074
|
+
- format() with SQL
|
|
1075
|
+
- % formatting with SQL
|
|
1076
|
+
- string concatenation with SQL
|
|
1077
|
+
|
|
1078
|
+
detection commands:
|
|
1079
|
+
<terminal>grep -rn "execute.*f\"" --include="*.py" . 2>/dev/null</terminal>
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
pattern 2: eval/exec with user input
|
|
1083
|
+
|
|
1084
|
+
vulnerable:
|
|
1085
|
+
result = eval(user_input)
|
|
1086
|
+
|
|
1087
|
+
indicators:
|
|
1088
|
+
- eval() with variable from user
|
|
1089
|
+
- exec() with variable from user
|
|
1090
|
+
- compile() with user input
|
|
1091
|
+
|
|
1092
|
+
detection commands:
|
|
1093
|
+
<terminal>grep -rn "eval(request\|eval(input\|exec(request" --include="*.py" . 2>/dev/null</terminal>
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
pattern 3: shell command with user input
|
|
1097
|
+
|
|
1098
|
+
vulnerable:
|
|
1099
|
+
os.system(f"cat {filename}")
|
|
1100
|
+
|
|
1101
|
+
indicators:
|
|
1102
|
+
- os.system() with variables
|
|
1103
|
+
- subprocess with shell=True
|
|
1104
|
+
- user input in command string
|
|
1105
|
+
|
|
1106
|
+
detection commands:
|
|
1107
|
+
<terminal>grep -rn "shell=True" --include="*.py" . 2>/dev/null</terminal>
|
|
1108
|
+
|
|
1109
|
+
|
|
1110
|
+
pattern 4: hardcoded secrets
|
|
1111
|
+
|
|
1112
|
+
vulnerable:
|
|
1113
|
+
API_KEY = "sk_live_1234567890"
|
|
1114
|
+
|
|
1115
|
+
indicators:
|
|
1116
|
+
- assignment of strings to SECRET/KEY/PASSWORD vars
|
|
1117
|
+
- secrets in config files
|
|
1118
|
+
- secrets in example files
|
|
1119
|
+
|
|
1120
|
+
detection commands:
|
|
1121
|
+
<terminal>grep -rnE "(SECRET|PASSWORD|KEY|TOKEN)\\s*=\\s*['\"]" --include="*.py" . 2>/dev/null</terminal>
|
|
1122
|
+
|
|
1123
|
+
|
|
1124
|
+
pattern 5: weak password hashing
|
|
1125
|
+
|
|
1126
|
+
vulnerable:
|
|
1127
|
+
hash = md5(password.encode())
|
|
1128
|
+
|
|
1129
|
+
indicators:
|
|
1130
|
+
- hashlib.md5 for passwords
|
|
1131
|
+
- hashlib.sha1 for passwords
|
|
1132
|
+
- custom hash implementations
|
|
1133
|
+
|
|
1134
|
+
detection commands:
|
|
1135
|
+
<terminal>grep -rn "md5.*pass\|sha1.*pass" --include="*.py" -i . 2>/dev/null</terminal>
|
|
1136
|
+
|
|
1137
|
+
|
|
1138
|
+
pattern 6: missing authentication
|
|
1139
|
+
|
|
1140
|
+
vulnerable:
|
|
1141
|
+
@app.route("/admin")
|
|
1142
|
+
def admin_panel():
|
|
1143
|
+
return sensitive_data
|
|
1144
|
+
|
|
1145
|
+
indicators:
|
|
1146
|
+
- routes without auth decorators
|
|
1147
|
+
- no user check in function
|
|
1148
|
+
- sensitive endpoints exposed
|
|
1149
|
+
|
|
1150
|
+
detection commands:
|
|
1151
|
+
<terminal>grep -rn "@app.route" --include="*.py" . 2>/dev/null | grep -v "login\|auth"</terminal>
|
|
1152
|
+
|
|
1153
|
+
|
|
1154
|
+
pattern 7: path traversal
|
|
1155
|
+
|
|
1156
|
+
vulnerable:
|
|
1157
|
+
filename = request.args.get("file")
|
|
1158
|
+
return open(f"/var/data/{filename}").read()
|
|
1159
|
+
|
|
1160
|
+
indicators:
|
|
1161
|
+
- open() with user input
|
|
1162
|
+
- Path() with user input
|
|
1163
|
+
- no path sanitization
|
|
1164
|
+
|
|
1165
|
+
detection commands:
|
|
1166
|
+
<terminal>grep -rn "open(.*%\|open(.*format\|Path(.*format" --include="*.py" . 2>/dev/null</terminal>
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
pattern 8: XSS via template
|
|
1170
|
+
|
|
1171
|
+
vulnerable:
|
|
1172
|
+
return render_template_string(f"<h1>{user_input}</h1>")
|
|
1173
|
+
|
|
1174
|
+
indicators:
|
|
1175
|
+
- render_template_string with user input
|
|
1176
|
+
- HTML without escaping
|
|
1177
|
+
- direct user input in response
|
|
1178
|
+
|
|
1179
|
+
detection commands:
|
|
1180
|
+
<terminal>grep -rn "render_template_string" --include="*.py" . 2>/dev/null</terminal>
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
pattern 9: insecure deserialization
|
|
1184
|
+
|
|
1185
|
+
vulnerable:
|
|
1186
|
+
data = pickle.loads(user_data)
|
|
1187
|
+
|
|
1188
|
+
indicators:
|
|
1189
|
+
- pickle.loads() with external data
|
|
1190
|
+
- yaml.load() without SafeLoader
|
|
1191
|
+
- marshal.loads()
|
|
1192
|
+
|
|
1193
|
+
detection commands:
|
|
1194
|
+
<terminal>grep -rn "pickle.loads\|yaml.load\|marshal.loads" --include="*.py" . 2>/dev/null</terminal>
|
|
1195
|
+
|
|
1196
|
+
|
|
1197
|
+
pattern 10: timing attack vulnerability
|
|
1198
|
+
|
|
1199
|
+
vulnerable:
|
|
1200
|
+
if user.stored_token == input_token:
|
|
1201
|
+
|
|
1202
|
+
indicators:
|
|
1203
|
+
- == for string comparison of secrets
|
|
1204
|
+
- password comparison without timing-safe compare
|
|
1205
|
+
|
|
1206
|
+
detection commands:
|
|
1207
|
+
<terminal>grep -rn "==.*token\|==.*password\|==.*secret" --include="*.py" -i . 2>/dev/null</terminal>
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
PHASE 18: SECURITY REVIEW RULES
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
while this skill is active, these rules are MANDATORY:
|
|
1214
|
+
|
|
1215
|
+
[1] NEVER modify code during security review
|
|
1216
|
+
this is a research-only skill
|
|
1217
|
+
identify and document, do not fix
|
|
1218
|
+
|
|
1219
|
+
[2] ALWAYS provide evidence for findings
|
|
1220
|
+
include file paths, line numbers
|
|
1221
|
+
show vulnerable code snippets
|
|
1222
|
+
explain the attack scenario
|
|
1223
|
+
|
|
1224
|
+
[3] classify vulnerabilities by severity
|
|
1225
|
+
use standard severity levels
|
|
1226
|
+
provide rationale for classification
|
|
1227
|
+
reference OWASP/CWE where applicable
|
|
1228
|
+
|
|
1229
|
+
[4] produce actionable reports
|
|
1230
|
+
each finding needs clear remediation
|
|
1231
|
+
include secure code examples
|
|
1232
|
+
prioritize by risk
|
|
1233
|
+
|
|
1234
|
+
[5] verify findings before reporting
|
|
1235
|
+
eliminate false positives
|
|
1236
|
+
understand context before judging
|
|
1237
|
+
distinguish between real issues and best practices
|
|
1238
|
+
|
|
1239
|
+
[6] check for common vulnerability patterns
|
|
1240
|
+
OWASP top 10
|
|
1241
|
+
CWE top 25
|
|
1242
|
+
language-specific vulnerabilities
|
|
1243
|
+
|
|
1244
|
+
[7] review both code and configuration
|
|
1245
|
+
code vulnerabilities
|
|
1246
|
+
framework configuration
|
|
1247
|
+
deployment settings
|
|
1248
|
+
infrastructure as code
|
|
1249
|
+
|
|
1250
|
+
[8] consider the threat model
|
|
1251
|
+
who are the attackers?
|
|
1252
|
+
what are their capabilities?
|
|
1253
|
+
what is the impact of compromise?
|
|
1254
|
+
|
|
1255
|
+
[9] report findings constructively
|
|
1256
|
+
blameless language
|
|
1257
|
+
focus on the vulnerability, not the developer
|
|
1258
|
+
provide learning resources
|
|
1259
|
+
|
|
1260
|
+
[10] know the scope and stay within it
|
|
1261
|
+
review only what was requested
|
|
1262
|
+
get permission before expanded testing
|
|
1263
|
+
respect boundaries
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
PHASE 19: SECURITY REVIEW WORKFLOW
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
step 1: preparation
|
|
1270
|
+
|
|
1271
|
+
[ ] understand the application purpose
|
|
1272
|
+
[ ] identify the technology stack
|
|
1273
|
+
[ ] map the attack surface
|
|
1274
|
+
[ ] identify entry points
|
|
1275
|
+
[ ] identify data flows
|
|
1276
|
+
[ ] identify authentication/authorization mechanisms
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
step 2: automated scanning
|
|
1280
|
+
|
|
1281
|
+
[ ] run bandit static analysis
|
|
1282
|
+
[ ] run semgrep security rules
|
|
1283
|
+
[ ] run dependency audit (pip-audit, safety)
|
|
1284
|
+
[ ] run container scan if applicable
|
|
1285
|
+
[ ] collect all results for review
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
step 3: manual code review
|
|
1289
|
+
|
|
1290
|
+
[ ] review authentication implementation
|
|
1291
|
+
[ ] review authorization checks
|
|
1292
|
+
[ ] review input validation
|
|
1293
|
+
[ ] review output encoding
|
|
1294
|
+
[ ] review cryptography usage
|
|
1295
|
+
[ ] review error handling
|
|
1296
|
+
[ ] review logging practices
|
|
1297
|
+
[ ] review configuration files
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
step 4: vulnerability validation
|
|
1301
|
+
|
|
1302
|
+
[ ] verify each automated finding
|
|
1303
|
+
[ ] eliminate false positives
|
|
1304
|
+
[ ] understand context
|
|
1305
|
+
[ ] assess exploitability
|
|
1306
|
+
[ ] determine impact
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
step 5: report generation
|
|
1310
|
+
|
|
1311
|
+
[ ] document each vulnerability
|
|
1312
|
+
[ ] classify severity
|
|
1313
|
+
[ ] provide remediation guidance
|
|
1314
|
+
[ ] prioritize findings
|
|
1315
|
+
[ ] create executive summary
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
step 6: delivery
|
|
1319
|
+
|
|
1320
|
+
[ ] format report appropriately
|
|
1321
|
+
[ ] include all necessary details
|
|
1322
|
+
[ ] maintain confidentiality
|
|
1323
|
+
[ ] follow disclosure policies
|
|
1324
|
+
[ ] provide support for questions
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
FINAL REMINDERS
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
security research protects systems
|
|
1331
|
+
|
|
1332
|
+
your findings enable safer software.
|
|
1333
|
+
thoroughness matters - one missed vulnerability can be catastrophic.
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
context is everything
|
|
1337
|
+
|
|
1338
|
+
not all findings are equally important.
|
|
1339
|
+
consider:
|
|
1340
|
+
- exploitability
|
|
1341
|
+
- impact
|
|
1342
|
+
- environment
|
|
1343
|
+
- threat model
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
communication matters
|
|
1347
|
+
|
|
1348
|
+
a well-written report gets fixed.
|
|
1349
|
+
a poorly written report gets ignored.
|
|
1350
|
+
be clear, actionable, and constructive.
|
|
1351
|
+
|
|
1352
|
+
|
|
1353
|
+
you are the shield
|
|
1354
|
+
|
|
1355
|
+
your work prevents breaches.
|
|
1356
|
+
your diligence protects users.
|
|
1357
|
+
your thoroughness saves reputations.
|
|
1358
|
+
|
|
1359
|
+
find the vulnerabilities before the attackers do.
|