mallcop 0.1.0__tar.gz

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 (162) hide show
  1. mallcop-0.1.0/LICENSE +190 -0
  2. mallcop-0.1.0/PKG-INFO +283 -0
  3. mallcop-0.1.0/README.md +264 -0
  4. mallcop-0.1.0/pyproject.toml +49 -0
  5. mallcop-0.1.0/setup.cfg +4 -0
  6. mallcop-0.1.0/src/mallcop/__init__.py +3 -0
  7. mallcop-0.1.0/src/mallcop/actors/__init__.py +9 -0
  8. mallcop-0.1.0/src/mallcop/actors/_base.py +13 -0
  9. mallcop-0.1.0/src/mallcop/actors/_schema.py +93 -0
  10. mallcop-0.1.0/src/mallcop/actors/actor_selection.py +84 -0
  11. mallcop-0.1.0/src/mallcop/actors/batch.py +228 -0
  12. mallcop-0.1.0/src/mallcop/actors/channels.py +234 -0
  13. mallcop-0.1.0/src/mallcop/actors/confidence.py +95 -0
  14. mallcop-0.1.0/src/mallcop/actors/heal/__init__.py +429 -0
  15. mallcop-0.1.0/src/mallcop/actors/notify_base.py +114 -0
  16. mallcop-0.1.0/src/mallcop/actors/notify_email/__init__.py +1 -0
  17. mallcop-0.1.0/src/mallcop/actors/notify_email/channel.py +163 -0
  18. mallcop-0.1.0/src/mallcop/actors/notify_slack/__init__.py +1 -0
  19. mallcop-0.1.0/src/mallcop/actors/notify_slack/channel.py +102 -0
  20. mallcop-0.1.0/src/mallcop/actors/notify_teams/__init__.py +1 -0
  21. mallcop-0.1.0/src/mallcop/actors/notify_teams/channel.py +64 -0
  22. mallcop-0.1.0/src/mallcop/actors/runtime.py +771 -0
  23. mallcop-0.1.0/src/mallcop/actors/triage/__init__.py +1 -0
  24. mallcop-0.1.0/src/mallcop/actors/validation.py +202 -0
  25. mallcop-0.1.0/src/mallcop/app_integration.py +149 -0
  26. mallcop-0.1.0/src/mallcop/aws_sigv4.py +118 -0
  27. mallcop-0.1.0/src/mallcop/baseline.py +219 -0
  28. mallcop-0.1.0/src/mallcop/boundary.py +247 -0
  29. mallcop-0.1.0/src/mallcop/budget.py +150 -0
  30. mallcop-0.1.0/src/mallcop/cli.py +2441 -0
  31. mallcop-0.1.0/src/mallcop/cli_format.py +111 -0
  32. mallcop-0.1.0/src/mallcop/cli_pipeline.py +216 -0
  33. mallcop-0.1.0/src/mallcop/config.py +414 -0
  34. mallcop-0.1.0/src/mallcop/connectors/__init__.py +1 -0
  35. mallcop-0.1.0/src/mallcop/connectors/_base.py +33 -0
  36. mallcop-0.1.0/src/mallcop/connectors/_schema.py +46 -0
  37. mallcop-0.1.0/src/mallcop/connectors/_util.py +117 -0
  38. mallcop-0.1.0/src/mallcop/connectors/aws_cloudtrail/__init__.py +0 -0
  39. mallcop-0.1.0/src/mallcop/connectors/aws_cloudtrail/connector.py +394 -0
  40. mallcop-0.1.0/src/mallcop/connectors/aws_cloudtrail/tools.py +11 -0
  41. mallcop-0.1.0/src/mallcop/connectors/azure/__init__.py +1 -0
  42. mallcop-0.1.0/src/mallcop/connectors/azure/connector.py +254 -0
  43. mallcop-0.1.0/src/mallcop/connectors/container_logs/__init__.py +1 -0
  44. mallcop-0.1.0/src/mallcop/connectors/container_logs/connector.py +394 -0
  45. mallcop-0.1.0/src/mallcop/connectors/github/__init__.py +1 -0
  46. mallcop-0.1.0/src/mallcop/connectors/github/connector.py +325 -0
  47. mallcop-0.1.0/src/mallcop/connectors/m365/__init__.py +1 -0
  48. mallcop-0.1.0/src/mallcop/connectors/m365/connector.py +356 -0
  49. mallcop-0.1.0/src/mallcop/connectors/openclaw/__init__.py +1 -0
  50. mallcop-0.1.0/src/mallcop/connectors/openclaw/connector.py +298 -0
  51. mallcop-0.1.0/src/mallcop/connectors/openclaw/skills.py +91 -0
  52. mallcop-0.1.0/src/mallcop/connectors/openclaw/tools.py +90 -0
  53. mallcop-0.1.0/src/mallcop/connectors/supabase/__init__.py +0 -0
  54. mallcop-0.1.0/src/mallcop/connectors/supabase/connector.py +354 -0
  55. mallcop-0.1.0/src/mallcop/connectors/vercel/__init__.py +1 -0
  56. mallcop-0.1.0/src/mallcop/connectors/vercel/connector.py +292 -0
  57. mallcop-0.1.0/src/mallcop/connectors/vercel/tools.py +9 -0
  58. mallcop-0.1.0/src/mallcop/consensus.py +101 -0
  59. mallcop-0.1.0/src/mallcop/cost_estimator.py +54 -0
  60. mallcop-0.1.0/src/mallcop/crontab.py +219 -0
  61. mallcop-0.1.0/src/mallcop/detect.py +88 -0
  62. mallcop-0.1.0/src/mallcop/detectors/__init__.py +1 -0
  63. mallcop-0.1.0/src/mallcop/detectors/_base.py +21 -0
  64. mallcop-0.1.0/src/mallcop/detectors/_schema.py +51 -0
  65. mallcop-0.1.0/src/mallcop/detectors/auth_failure_burst/__init__.py +1 -0
  66. mallcop-0.1.0/src/mallcop/detectors/auth_failure_burst/detector.py +150 -0
  67. mallcop-0.1.0/src/mallcop/detectors/container_probing/__init__.py +0 -0
  68. mallcop-0.1.0/src/mallcop/detectors/container_probing/detector.py +124 -0
  69. mallcop-0.1.0/src/mallcop/detectors/declarative.py +286 -0
  70. mallcop-0.1.0/src/mallcop/detectors/financial_anomalies/__init__.py +1 -0
  71. mallcop-0.1.0/src/mallcop/detectors/financial_anomalies/detector.py +94 -0
  72. mallcop-0.1.0/src/mallcop/detectors/git_oops/__init__.py +0 -0
  73. mallcop-0.1.0/src/mallcop/detectors/git_oops/detector.py +246 -0
  74. mallcop-0.1.0/src/mallcop/detectors/injection_probe/__init__.py +1 -0
  75. mallcop-0.1.0/src/mallcop/detectors/injection_probe/detector.py +115 -0
  76. mallcop-0.1.0/src/mallcop/detectors/log_format_drift/__init__.py +1 -0
  77. mallcop-0.1.0/src/mallcop/detectors/log_format_drift/detector.py +54 -0
  78. mallcop-0.1.0/src/mallcop/detectors/malicious_skill/__init__.py +1 -0
  79. mallcop-0.1.0/src/mallcop/detectors/malicious_skill/detector.py +109 -0
  80. mallcop-0.1.0/src/mallcop/detectors/new_actor/__init__.py +1 -0
  81. mallcop-0.1.0/src/mallcop/detectors/new_actor/detector.py +45 -0
  82. mallcop-0.1.0/src/mallcop/detectors/new_external_access/__init__.py +1 -0
  83. mallcop-0.1.0/src/mallcop/detectors/new_external_access/detector.py +103 -0
  84. mallcop-0.1.0/src/mallcop/detectors/openclaw_config_drift/__init__.py +1 -0
  85. mallcop-0.1.0/src/mallcop/detectors/openclaw_config_drift/detector.py +135 -0
  86. mallcop-0.1.0/src/mallcop/detectors/priv_escalation/__init__.py +1 -0
  87. mallcop-0.1.0/src/mallcop/detectors/priv_escalation/detector.py +95 -0
  88. mallcop-0.1.0/src/mallcop/detectors/unusual_resource_access/__init__.py +0 -0
  89. mallcop-0.1.0/src/mallcop/detectors/unusual_resource_access/detector.py +83 -0
  90. mallcop-0.1.0/src/mallcop/detectors/unusual_timing/__init__.py +1 -0
  91. mallcop-0.1.0/src/mallcop/detectors/unusual_timing/detector.py +54 -0
  92. mallcop-0.1.0/src/mallcop/detectors/volume_anomaly/__init__.py +1 -0
  93. mallcop-0.1.0/src/mallcop/detectors/volume_anomaly/detector.py +87 -0
  94. mallcop-0.1.0/src/mallcop/discover_app.py +130 -0
  95. mallcop-0.1.0/src/mallcop/escalate.py +580 -0
  96. mallcop-0.1.0/src/mallcop/feedback.py +259 -0
  97. mallcop-0.1.0/src/mallcop/flywheel/__init__.py +1 -0
  98. mallcop-0.1.0/src/mallcop/flywheel/anonymizer.py +390 -0
  99. mallcop-0.1.0/src/mallcop/flywheel/capture.py +120 -0
  100. mallcop-0.1.0/src/mallcop/flywheel/quality_gate.py +207 -0
  101. mallcop-0.1.0/src/mallcop/flywheel/synthesizer.py +182 -0
  102. mallcop-0.1.0/src/mallcop/intel_manifest.py +139 -0
  103. mallcop-0.1.0/src/mallcop/investigate.py +112 -0
  104. mallcop-0.1.0/src/mallcop/llm/__init__.py +149 -0
  105. mallcop-0.1.0/src/mallcop/llm/anthropic.py +161 -0
  106. mallcop-0.1.0/src/mallcop/llm/bedrock.py +224 -0
  107. mallcop-0.1.0/src/mallcop/llm/bedrock_mantle.py +196 -0
  108. mallcop-0.1.0/src/mallcop/llm/claude_code.py +224 -0
  109. mallcop-0.1.0/src/mallcop/llm/converters.py +97 -0
  110. mallcop-0.1.0/src/mallcop/llm/managed.py +93 -0
  111. mallcop-0.1.0/src/mallcop/llm/openai_compat.py +175 -0
  112. mallcop-0.1.0/src/mallcop/llm_types.py +42 -0
  113. mallcop-0.1.0/src/mallcop/parsers/__init__.py +1 -0
  114. mallcop-0.1.0/src/mallcop/parsers/runtime.py +294 -0
  115. mallcop-0.1.0/src/mallcop/patrol.py +120 -0
  116. mallcop-0.1.0/src/mallcop/patrol_cli.py +388 -0
  117. mallcop-0.1.0/src/mallcop/plugins.py +212 -0
  118. mallcop-0.1.0/src/mallcop/pro.py +240 -0
  119. mallcop-0.1.0/src/mallcop/reputation.py +255 -0
  120. mallcop-0.1.0/src/mallcop/research.py +463 -0
  121. mallcop-0.1.0/src/mallcop/resolution_rules.py +404 -0
  122. mallcop-0.1.0/src/mallcop/review.py +155 -0
  123. mallcop-0.1.0/src/mallcop/sanitize.py +142 -0
  124. mallcop-0.1.0/src/mallcop/scaffold.py +243 -0
  125. mallcop-0.1.0/src/mallcop/schemas.py +353 -0
  126. mallcop-0.1.0/src/mallcop/secrets.py +27 -0
  127. mallcop-0.1.0/src/mallcop/skills/__init__.py +5 -0
  128. mallcop-0.1.0/src/mallcop/skills/_schema.py +106 -0
  129. mallcop-0.1.0/src/mallcop/status.py +104 -0
  130. mallcop-0.1.0/src/mallcop/store.py +599 -0
  131. mallcop-0.1.0/src/mallcop/telemetry.py +79 -0
  132. mallcop-0.1.0/src/mallcop/tools/__init__.py +287 -0
  133. mallcop-0.1.0/src/mallcop/tools/baseline.py +146 -0
  134. mallcop-0.1.0/src/mallcop/tools/config.py +73 -0
  135. mallcop-0.1.0/src/mallcop/tools/events.py +134 -0
  136. mallcop-0.1.0/src/mallcop/tools/findings.py +131 -0
  137. mallcop-0.1.0/src/mallcop/tools/skills.py +306 -0
  138. mallcop-0.1.0/src/mallcop/trust.py +501 -0
  139. mallcop-0.1.0/src/mallcop/verify.py +636 -0
  140. mallcop-0.1.0/src/mallcop/watch.py +132 -0
  141. mallcop-0.1.0/src/mallcop.egg-info/PKG-INFO +283 -0
  142. mallcop-0.1.0/src/mallcop.egg-info/SOURCES.txt +160 -0
  143. mallcop-0.1.0/src/mallcop.egg-info/dependency_links.txt +1 -0
  144. mallcop-0.1.0/src/mallcop.egg-info/entry_points.txt +2 -0
  145. mallcop-0.1.0/src/mallcop.egg-info/requires.txt +11 -0
  146. mallcop-0.1.0/src/mallcop.egg-info/top_level.txt +1 -0
  147. mallcop-0.1.0/tests/test_action_level_keys.py +297 -0
  148. mallcop-0.1.0/tests/test_batch_onboarding.py +317 -0
  149. mallcop-0.1.0/tests/test_boundary.py +341 -0
  150. mallcop-0.1.0/tests/test_boundary_integration.py +503 -0
  151. mallcop-0.1.0/tests/test_confidence.py +195 -0
  152. mallcop-0.1.0/tests/test_crontab.py +377 -0
  153. mallcop-0.1.0/tests/test_feedback.py +436 -0
  154. mallcop-0.1.0/tests/test_feedback_weighting.py +327 -0
  155. mallcop-0.1.0/tests/test_intel_manifest.py +428 -0
  156. mallcop-0.1.0/tests/test_learned_context.py +395 -0
  157. mallcop-0.1.0/tests/test_patrol_config.py +331 -0
  158. mallcop-0.1.0/tests/test_research.py +718 -0
  159. mallcop-0.1.0/tests/test_retrospective.py +281 -0
  160. mallcop-0.1.0/tests/test_squelch.py +347 -0
  161. mallcop-0.1.0/tests/test_telemetry.py +103 -0
  162. mallcop-0.1.0/tests/test_tool_enrichment.py +401 -0
mallcop-0.1.0/LICENSE ADDED
@@ -0,0 +1,190 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to the Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by the Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding any notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ Copyright 2026 Mallcop Contributors
179
+
180
+ Licensed under the Apache License, Version 2.0 (the "License");
181
+ you may not use this file except in compliance with the License.
182
+ You may obtain a copy of the License at
183
+
184
+ http://www.apache.org/licenses/LICENSE-2.0
185
+
186
+ Unless required by applicable law or agreed to in writing, software
187
+ distributed under the License is distributed on an "AS IS" BASIS,
188
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
189
+ See the License for the specific language governing permissions and
190
+ limitations under the License.
mallcop-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,283 @@
1
+ Metadata-Version: 2.4
2
+ Name: mallcop
3
+ Version: 0.1.0
4
+ Summary: Security monitoring for small cloud operators
5
+ License-Expression: MIT
6
+ Requires-Python: >=3.12
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: click>=8.0
10
+ Requires-Dist: defusedxml>=0.7
11
+ Requires-Dist: pyyaml>=6.0
12
+ Requires-Dist: regex>=2024.0
13
+ Requires-Dist: requests>=2.28
14
+ Provides-Extra: aws
15
+ Requires-Dist: boto3>=1.28; extra == "aws"
16
+ Provides-Extra: dev
17
+ Requires-Dist: pytest>=8.0; extra == "dev"
18
+ Dynamic: license-file
19
+
20
+ # mallcop
21
+
22
+ Security monitoring for small cloud operators. AI-native. Self-hosted. Near-$0.
23
+
24
+ ## What is this?
25
+
26
+ Mallcop watches your cloud infrastructure and tells you when something's wrong. It's designed for AI agents to operate -- not humans clicking dashboards.
27
+
28
+ Think of it as the security guard at your mall. Not a SWAT team. Just someone who knows the building, notices when something's off, and calls you when it matters.
29
+
30
+ ## Who is it for?
31
+
32
+ - Solo founders running cloud services
33
+ - Small teams too small for a SIEM, too exposed for nothing
34
+ - AI agents operating infrastructure that need security awareness
35
+
36
+ ## What does it monitor?
37
+
38
+ 8 connectors, 12 detectors, 9 domain skills, 6 actors, 56 Academy Exam scenarios. 2664 tests.
39
+
40
+ ### Connectors
41
+
42
+ | Connector | What it watches |
43
+ |-----------|----------------|
44
+ | **Azure** | Activity log, container apps, resource modifications, Defender alerts |
45
+ | **AWS CloudTrail** | IAM changes, security group modifications, console logins, S3 policy changes |
46
+ | **GitHub** | Repo changes, permission changes, security alerts, Actions |
47
+ | **Microsoft 365** | Sign-ins, admin actions, email events |
48
+ | **Vercel** | Deployments, audit log, team membership changes |
49
+ | **Container Logs** | Container app stdout/stderr via Log Analytics |
50
+ | **Supabase** | Auth audit logs, Management API config monitoring |
51
+ | **OpenClaw** | Skill integrity, config drift, gateway security (via ClawCop) |
52
+
53
+ ### Detectors
54
+
55
+ | Detector | What it catches |
56
+ |----------|----------------|
57
+ | **priv-escalation** | Role grants, permission changes, self-elevation |
58
+ | **unusual-timing** | Activity outside established patterns |
59
+ | **auth-failure-burst** | Brute force and credential stuffing |
60
+ | **volume-anomaly** | Unusual event volume spikes |
61
+ | **new-actor** | Previously unseen identities |
62
+ | **new-external-access** | External access from new sources |
63
+ | **unusual-resource-access** | Known actors touching new resources |
64
+ | **injection-probe** | Prompt injection attempts in event data |
65
+ | **log-format-drift** | Container log format changes (parser degradation) |
66
+ | **git-oops** | Leaked credentials in git repos |
67
+ | **malicious-skill** | Encoded payloads, quarantine bypass, known-bad authors in OpenClaw skills |
68
+ | **openclaw-config-drift** | Auth disabled, plaintext secrets, mDNS broadcasting |
69
+
70
+ ### Domain Skills
71
+
72
+ 9 SSH-signed investigation skills with a PKI trust web. Skills provide domain-specific reasoning that investigation actors load on demand.
73
+
74
+ | Skill | Domain |
75
+ |-------|--------|
76
+ | **privilege-analysis** | General privilege escalation reasoning (parent skill) |
77
+ | **aws-iam** | IAM trust policies, AssumeRole chains, SCPs |
78
+ | **azure-security** | Azure RBAC, Activity Log, Container Apps, Defender |
79
+ | **github-security** | Repository permissions, Actions, deploy keys |
80
+ | **supabase-security** | Auth policies, RLS, Management API |
81
+ | **container-logs-security** | Log analysis, crash patterns, log injection |
82
+ | **openclaw-security** | Malicious skill detection, ClawHavoc IOCs |
83
+ | **m365-security** | Sign-in analysis, admin operations |
84
+ | **vercel-security** | Deployment security, team access |
85
+
86
+ Skills are signed with SSH keys and verified against a trust web (anchors, endorsements, BFS trust chain). `skills.lock` pins content hashes. Unsigned or tampered skills are refused.
87
+
88
+ ### Actors
89
+
90
+ | Actor | Role |
91
+ |-------|------|
92
+ | **triage** | Level-1: quick severity assessment, resolve or escalate |
93
+ | **investigate** | Level-2: deep investigation with tools, skills, and baseline cross-reference |
94
+ | **heal** | Auto-remediation for parser drift and config issues |
95
+ | **notify-teams** | Microsoft Teams webhook notifications |
96
+ | **notify-slack** | Slack Block Kit notifications |
97
+ | **notify-email** | HTML digest email via SMTP |
98
+
99
+ ### ClawCop — OpenClaw Security Monitor
100
+
101
+ Mallcop watches your cloud. ClawCop watches your AI agent.
102
+
103
+ ClawCop is mallcop's built-in OpenClaw security capability. Add the `openclaw` connector to your `mallcop.yaml` and it works through the standard scan/detect/escalate pipeline.
104
+
105
+ It catches malicious skills, config drift, and skill lifecycle changes. No API credentials required -- reads directly from `~/.openclaw/`. See [docs/clawcop.md](docs/clawcop.md) for details.
106
+
107
+ ### Academy Exam
108
+
109
+ 56 adversarial scenarios that test mallcop's investigation quality. Each scenario presents a security finding with a trap -- a deceptive element designed to exploit common reasoning failures (admin exemption, known-actor bias, context switching).
110
+
111
+ ```bash
112
+ mallcop exam run # run all scenarios
113
+ mallcop exam run --tag AE # run admin-exemption scenarios only
114
+ mallcop exam run --scenario PE-01 # run one specific scenario
115
+ mallcop improve --from-exam results.json # analyze failures, suggest fixes
116
+ ```
117
+
118
+ Graded by an LLM judge on reasoning quality, investigation thoroughness, and actionability. Not pass/fail on the action -- pass/fail on whether the investigation was rigorous.
119
+
120
+ ### Entity Reputation
121
+
122
+ Tracks per-entity trust scores across all connectors. Findings decrement scores by severity. Baseline matches reward scores. Scores decay toward neutral with a 30-day half-life.
123
+
124
+ ## Install
125
+
126
+ ```bash
127
+ pip install mallcop
128
+ ```
129
+
130
+ ## Quickstart
131
+
132
+ ### 1. Initialize
133
+
134
+ ```bash
135
+ mkdir my-security && cd my-security
136
+ git init
137
+ mallcop init
138
+ ```
139
+
140
+ `mallcop init` discovers your environment -- probes for Azure subscriptions, GitHub orgs, and other connected platforms. It writes a `mallcop.yaml` config file and reports estimated costs.
141
+
142
+ All output is JSON by default (for AI agents). Use `--human` for readable output on any command.
143
+
144
+ ### 2. First scan
145
+
146
+ ```bash
147
+ mallcop scan
148
+ mallcop detect
149
+ ```
150
+
151
+ `mallcop scan` polls all configured connectors and stores events in `events/` as JSONL files.
152
+
153
+ `mallcop detect` runs detectors against stored events and writes findings to `findings.jsonl`.
154
+
155
+ During the first 14 days (the baseline learning period), detectors log findings as informational only -- no escalation, no alerts. This lets mallcop learn what "normal" looks like for your environment.
156
+
157
+ ### 3. Automated monitoring
158
+
159
+ ```bash
160
+ mallcop watch # scan + detect + escalate
161
+ mallcop watch --dry-run # skip actor escalation
162
+ ```
163
+
164
+ ### 4. Set up scheduled runs
165
+
166
+ The recommended setup is a GitHub Actions workflow that runs every 6 hours:
167
+
168
+ ```yaml
169
+ name: mallcop-watch
170
+ on:
171
+ schedule:
172
+ - cron: '0 */6 * * *'
173
+ workflow_dispatch:
174
+
175
+ jobs:
176
+ watch:
177
+ runs-on: ubuntu-latest
178
+ steps:
179
+ - uses: actions/checkout@v4
180
+ - uses: actions/setup-python@v5
181
+ with:
182
+ python-version: '3.12'
183
+ - run: pip install mallcop
184
+ - run: mallcop watch
185
+ env:
186
+ AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
187
+ AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
188
+ AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
189
+ - run: |
190
+ git config user.name "mallcop"
191
+ git config user.email "mallcop@noreply"
192
+ git add -A
193
+ git diff --cached --quiet || git commit -m "mallcop watch $(date -u +%Y-%m-%dT%H:%M:%SZ)"
194
+ git push
195
+ ```
196
+
197
+ ### 5. Investigation
198
+
199
+ ```bash
200
+ mallcop review # orient: all open findings + context
201
+ mallcop investigate <finding-id> # deep investigation with tools + skills
202
+ mallcop events --finding <id> # query events
203
+ mallcop baseline --actor <actor> # check baseline for an actor
204
+ mallcop report --status open --severity warn,critical
205
+ ```
206
+
207
+ ### 6. Skill and trust management
208
+
209
+ ```bash
210
+ mallcop skill list # show installed skills
211
+ mallcop skill sign <dir> --key <keyfile> # sign a skill directory
212
+ mallcop skill verify <dir> # verify skill signature
213
+ mallcop skill lock # regenerate skills.lock
214
+ mallcop trust add-anchor <id> <pubkey> # add trust anchor
215
+ mallcop trust endorse <id> --scope "aws-*" --level author --key <keyfile>
216
+ mallcop trust chain <identity> # show trust path
217
+ mallcop trust list # show trust web
218
+ ```
219
+
220
+ ## CLI commands
221
+
222
+ ```
223
+ # Core pipeline
224
+ mallcop init # discover environment, write config
225
+ mallcop scan # poll all connectors, store events
226
+ mallcop detect # run detectors against events
227
+ mallcop escalate # invoke actor chain on open findings
228
+ mallcop watch [--dry-run] # scan + detect + escalate
229
+
230
+ # Investigation
231
+ mallcop review # POST.md + all open findings + commands
232
+ mallcop investigate <finding-id> # deep context for one finding
233
+ mallcop finding <finding-id> # finding detail + annotation trail
234
+ mallcop events [--finding] [--actor] [--source] [--hours] [--type]
235
+ mallcop report [--status] [--severity] [--since]
236
+ mallcop baseline [--actor] [--entity]
237
+ mallcop status [--costs] # operational status and cost trends
238
+
239
+ # Finding management
240
+ mallcop annotate <finding-id> <text>
241
+ mallcop ack <finding-id> [--reason]
242
+
243
+ # Skills and trust
244
+ mallcop skill list | sign | verify | lock
245
+ mallcop trust add-anchor | add-key | endorse | chain | list
246
+
247
+ # Quality
248
+ mallcop exam run [--tag] [--scenario] [--model]
249
+ mallcop improve [--from-exam <file>] [--refresh-patterns]
250
+
251
+ # Development
252
+ mallcop scaffold <type> <name>
253
+ mallcop verify [--all]
254
+ mallcop discover-app <app-name>
255
+ ```
256
+
257
+ All commands output JSON by default. Use `--human` for readable output.
258
+
259
+ ## Deployment repo structure
260
+
261
+ ```
262
+ my-security/
263
+ mallcop.yaml # config: connectors, routing, secrets, budget
264
+ checkpoints.yaml # connector cursors (last poll position)
265
+ events/ # append-only JSONL, partitioned by source and month
266
+ azure-2026-03.jsonl
267
+ github-2026-03.jsonl
268
+ findings.jsonl # detector output
269
+ costs.jsonl # per-run token usage and cost tracking
270
+ baseline.json # known actors, frequency tables, relationships
271
+ reputation.jsonl # per-entity trust scores
272
+ skills.lock # skill content hash pins
273
+ ```
274
+
275
+ Everything is git-tracked. `git log events/` shows when events were ingested. `git diff findings.jsonl` shows what changed between runs.
276
+
277
+ ## Cost
278
+
279
+ Near-$0. Mallcop is free and open source. The platform APIs it monitors are free tier. The only cost is LLM inference for the triage/investigate actors during escalation, controlled by configurable budget limits (default: 50k tokens/run). `mallcop init` estimates your steady-state costs based on discovered resources.
280
+
281
+ ## License
282
+
283
+ Apache 2.0