immunio 0.15.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +234 -0
- data/README.md +147 -0
- data/bin/immunio +5 -0
- data/lib/immunio.rb +29 -0
- data/lib/immunio/agent.rb +260 -0
- data/lib/immunio/authentication.rb +96 -0
- data/lib/immunio/blocked_app.rb +38 -0
- data/lib/immunio/channel.rb +432 -0
- data/lib/immunio/cli.rb +39 -0
- data/lib/immunio/context.rb +114 -0
- data/lib/immunio/errors.rb +43 -0
- data/lib/immunio/immunio_ca.crt +45 -0
- data/lib/immunio/logger.rb +87 -0
- data/lib/immunio/plugins/action_dispatch.rb +45 -0
- data/lib/immunio/plugins/action_view.rb +431 -0
- data/lib/immunio/plugins/active_record.rb +707 -0
- data/lib/immunio/plugins/active_record_relation.rb +370 -0
- data/lib/immunio/plugins/authlogic.rb +80 -0
- data/lib/immunio/plugins/csrf.rb +24 -0
- data/lib/immunio/plugins/devise.rb +40 -0
- data/lib/immunio/plugins/environment_reporter.rb +69 -0
- data/lib/immunio/plugins/eval.rb +51 -0
- data/lib/immunio/plugins/exception_handler.rb +55 -0
- data/lib/immunio/plugins/gems_tracker.rb +5 -0
- data/lib/immunio/plugins/haml.rb +36 -0
- data/lib/immunio/plugins/http_finisher.rb +50 -0
- data/lib/immunio/plugins/http_tracker.rb +203 -0
- data/lib/immunio/plugins/io.rb +96 -0
- data/lib/immunio/plugins/redirect.rb +42 -0
- data/lib/immunio/plugins/warden.rb +66 -0
- data/lib/immunio/processor.rb +234 -0
- data/lib/immunio/rails.rb +26 -0
- data/lib/immunio/request.rb +139 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +27 -0
- data/lib/immunio/rufus_lua_ext/state.rb +157 -0
- data/lib/immunio/rufus_lua_ext/table.rb +137 -0
- data/lib/immunio/rufus_lua_ext/utils.rb +13 -0
- data/lib/immunio/version.rb +5 -0
- data/lib/immunio/vm.rb +291 -0
- data/lua-hooks/ext/all.c +78 -0
- data/lua-hooks/ext/bitop/README +22 -0
- data/lua-hooks/ext/bitop/bit.c +189 -0
- data/lua-hooks/ext/extconf.rb +38 -0
- data/lua-hooks/ext/libinjection/COPYING +37 -0
- data/lua-hooks/ext/libinjection/libinjection.h +65 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.c +847 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.h +54 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.c +2301 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.h +295 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +9349 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.c +531 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.h +21 -0
- data/lua-hooks/ext/libinjection/lualib.c +109 -0
- data/lua-hooks/ext/lpeg/HISTORY +90 -0
- data/lua-hooks/ext/lpeg/lpcap.c +537 -0
- data/lua-hooks/ext/lpeg/lpcap.h +43 -0
- data/lua-hooks/ext/lpeg/lpcode.c +986 -0
- data/lua-hooks/ext/lpeg/lpcode.h +34 -0
- data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
- data/lua-hooks/ext/lpeg/lpeg.html +1429 -0
- data/lua-hooks/ext/lpeg/lpprint.c +244 -0
- data/lua-hooks/ext/lpeg/lpprint.h +35 -0
- data/lua-hooks/ext/lpeg/lptree.c +1238 -0
- data/lua-hooks/ext/lpeg/lptree.h +77 -0
- data/lua-hooks/ext/lpeg/lptypes.h +149 -0
- data/lua-hooks/ext/lpeg/lpvm.c +355 -0
- data/lua-hooks/ext/lpeg/lpvm.h +58 -0
- data/lua-hooks/ext/lpeg/makefile +55 -0
- data/lua-hooks/ext/lpeg/re.html +498 -0
- data/lua-hooks/ext/lpeg/test.lua +1409 -0
- data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +45 -0
- data/lua-hooks/ext/lua-cmsgpack/README.md +115 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +957 -0
- data/lua-hooks/ext/lua-cmsgpack/test.lua +570 -0
- data/lua-hooks/ext/lua-snapshot/LICENSE +7 -0
- data/lua-hooks/ext/lua-snapshot/Makefile +12 -0
- data/lua-hooks/ext/lua-snapshot/README.md +18 -0
- data/lua-hooks/ext/lua-snapshot/dump.lua +15 -0
- data/lua-hooks/ext/lua-snapshot/snapshot.c +455 -0
- data/lua-hooks/ext/lua/COPYRIGHT +34 -0
- data/lua-hooks/ext/lua/lapi.c +1087 -0
- data/lua-hooks/ext/lua/lapi.h +16 -0
- data/lua-hooks/ext/lua/lauxlib.c +652 -0
- data/lua-hooks/ext/lua/lauxlib.h +174 -0
- data/lua-hooks/ext/lua/lbaselib.c +659 -0
- data/lua-hooks/ext/lua/lcode.c +831 -0
- data/lua-hooks/ext/lua/lcode.h +76 -0
- data/lua-hooks/ext/lua/ldblib.c +398 -0
- data/lua-hooks/ext/lua/ldebug.c +638 -0
- data/lua-hooks/ext/lua/ldebug.h +33 -0
- data/lua-hooks/ext/lua/ldo.c +519 -0
- data/lua-hooks/ext/lua/ldo.h +57 -0
- data/lua-hooks/ext/lua/ldump.c +164 -0
- data/lua-hooks/ext/lua/lfunc.c +174 -0
- data/lua-hooks/ext/lua/lfunc.h +34 -0
- data/lua-hooks/ext/lua/lgc.c +710 -0
- data/lua-hooks/ext/lua/lgc.h +110 -0
- data/lua-hooks/ext/lua/linit.c +38 -0
- data/lua-hooks/ext/lua/liolib.c +556 -0
- data/lua-hooks/ext/lua/llex.c +463 -0
- data/lua-hooks/ext/lua/llex.h +81 -0
- data/lua-hooks/ext/lua/llimits.h +128 -0
- data/lua-hooks/ext/lua/lmathlib.c +263 -0
- data/lua-hooks/ext/lua/lmem.c +86 -0
- data/lua-hooks/ext/lua/lmem.h +49 -0
- data/lua-hooks/ext/lua/loadlib.c +705 -0
- data/lua-hooks/ext/lua/loadlib_rel.c +760 -0
- data/lua-hooks/ext/lua/lobject.c +214 -0
- data/lua-hooks/ext/lua/lobject.h +381 -0
- data/lua-hooks/ext/lua/lopcodes.c +102 -0
- data/lua-hooks/ext/lua/lopcodes.h +268 -0
- data/lua-hooks/ext/lua/loslib.c +243 -0
- data/lua-hooks/ext/lua/lparser.c +1339 -0
- data/lua-hooks/ext/lua/lparser.h +82 -0
- data/lua-hooks/ext/lua/lstate.c +214 -0
- data/lua-hooks/ext/lua/lstate.h +169 -0
- data/lua-hooks/ext/lua/lstring.c +111 -0
- data/lua-hooks/ext/lua/lstring.h +31 -0
- data/lua-hooks/ext/lua/lstrlib.c +871 -0
- data/lua-hooks/ext/lua/ltable.c +588 -0
- data/lua-hooks/ext/lua/ltable.h +40 -0
- data/lua-hooks/ext/lua/ltablib.c +287 -0
- data/lua-hooks/ext/lua/ltm.c +75 -0
- data/lua-hooks/ext/lua/ltm.h +54 -0
- data/lua-hooks/ext/lua/lua.c +392 -0
- data/lua-hooks/ext/lua/lua.def +131 -0
- data/lua-hooks/ext/lua/lua.h +388 -0
- data/lua-hooks/ext/lua/lua.rc +28 -0
- data/lua-hooks/ext/lua/lua_dll.rc +26 -0
- data/lua-hooks/ext/lua/luac.c +200 -0
- data/lua-hooks/ext/lua/luac.rc +1 -0
- data/lua-hooks/ext/lua/luaconf.h +763 -0
- data/lua-hooks/ext/lua/luaconf.h.in +724 -0
- data/lua-hooks/ext/lua/luaconf.h.orig +763 -0
- data/lua-hooks/ext/lua/lualib.h +53 -0
- data/lua-hooks/ext/lua/lundump.c +227 -0
- data/lua-hooks/ext/lua/lundump.h +36 -0
- data/lua-hooks/ext/lua/lvm.c +767 -0
- data/lua-hooks/ext/lua/lvm.h +36 -0
- data/lua-hooks/ext/lua/lzio.c +82 -0
- data/lua-hooks/ext/lua/lzio.h +67 -0
- data/lua-hooks/ext/lua/print.c +227 -0
- data/lua-hooks/ext/luautf8/README.md +152 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +1274 -0
- data/lua-hooks/ext/luautf8/unidata.h +3064 -0
- data/lua-hooks/lib/boot.lua +254 -0
- data/lua-hooks/lib/encode.lua +4 -0
- data/lua-hooks/lib/lexers/LICENSE +21 -0
- data/lua-hooks/lib/lexers/bash.lua +134 -0
- data/lua-hooks/lib/lexers/bash_dqstr.lua +62 -0
- data/lua-hooks/lib/lexers/css.lua +216 -0
- data/lua-hooks/lib/lexers/html.lua +106 -0
- data/lua-hooks/lib/lexers/javascript.lua +68 -0
- data/lua-hooks/lib/lexers/lexer.lua +1575 -0
- data/lua-hooks/lib/lexers/markers.lua +33 -0
- metadata +308 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1c331edca1ddff7a5fcb72c6b6c28242157ff552
|
4
|
+
data.tar.gz: 23ceaa2748c24eae7a80d952278887361aab6d9f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2de2e6af290768ab138e0ad91a5ffa1dca0e3b80011c0eb45c4ff5b34241d2ef15911cb7e91a24579dee7c02babb8b688ff491516d81ccbffeec2be888d56336
|
7
|
+
data.tar.gz: c45c6cb2bcd16d4d317a444100d90713229c1599e7920c9d7cd203e0697dda0eca3d366cfed0d18f4cb0742ccba4a96ce86b01d51b1eeb485c9256dfc3811f8b
|
data/LICENSE
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
This product includes content covered by the following license:
|
2
|
+
Copyright (C) 1994-2008 Lua.org, PUC-Rio.
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
6
|
+
in the Software without restriction, including without limitation the rights
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
9
|
+
furnished to do so, subject to the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be included in
|
12
|
+
all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
THE SOFTWARE.
|
21
|
+
|
22
|
+
This product includes content covered by the following license:
|
23
|
+
Copyright (C) 2008-2012 Mike Pall.
|
24
|
+
|
25
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
26
|
+
of this software and associated documentation files (the "Software"), to deal
|
27
|
+
in the Software without restriction, including without limitation the rights
|
28
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
29
|
+
copies of the Software, and to permit persons to whom the Software is
|
30
|
+
furnished to do so, subject to the following conditions:
|
31
|
+
|
32
|
+
The above copyright notice and this permission notice shall be included in
|
33
|
+
all copies or substantial portions of the Software.
|
34
|
+
|
35
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
36
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
37
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
38
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
39
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
40
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
41
|
+
THE SOFTWARE.
|
42
|
+
|
43
|
+
This product includes content covered by the following license:
|
44
|
+
Copyright 2012, 2013, 2014
|
45
|
+
Nick Galbreath -- nickg [at] client9 [dot] com
|
46
|
+
http://www.client9.com/projects/libinjection/
|
47
|
+
|
48
|
+
All rights reserved.
|
49
|
+
|
50
|
+
Redistribution and use in source and binary forms, with or without
|
51
|
+
modification, are permitted provided that the following conditions are
|
52
|
+
met:
|
53
|
+
|
54
|
+
Redistributions of source code must retain the above copyright
|
55
|
+
notice, this list of conditions and the following disclaimer.
|
56
|
+
|
57
|
+
Redistributions in binary form must reproduce the above copyright
|
58
|
+
notice, this list of conditions and the following disclaimer in the
|
59
|
+
documentation and/or other materials provided with the distribution.
|
60
|
+
|
61
|
+
Neither the name of libinjection nor the names of its
|
62
|
+
contributors may be used to endorse or promote products derived from
|
63
|
+
this software without specific prior written permission.
|
64
|
+
|
65
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
66
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
67
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
68
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
69
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
70
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
71
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
72
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
73
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
74
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
75
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
76
|
+
|
77
|
+
This product includes content covered by the following license:
|
78
|
+
Copyright (C) 1994–2015 Lua.org, PUC-Rio.
|
79
|
+
|
80
|
+
Permission is hereby granted, free of charge,
|
81
|
+
to any person obtaining a copy of this software and
|
82
|
+
associated documentation files (the "Software"),
|
83
|
+
to deal in the Software without restriction,
|
84
|
+
including without limitation the rights to use,
|
85
|
+
copy, modify, merge, publish, distribute, sublicense,
|
86
|
+
and/or sell copies of the Software,
|
87
|
+
and to permit persons to whom the Software is
|
88
|
+
furnished to do so,
|
89
|
+
subject to the following conditions:
|
90
|
+
|
91
|
+
The above copyright notice and this permission notice
|
92
|
+
shall be included in all copies or substantial portions of the Software.
|
93
|
+
|
94
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
95
|
+
EXPRESS OR IMPLIED,
|
96
|
+
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
97
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
98
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
99
|
+
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
100
|
+
TORT OR OTHERWISE, ARISING FROM,
|
101
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
102
|
+
THE SOFTWARE.
|
103
|
+
|
104
|
+
This product includes content covered by the following license:
|
105
|
+
Copyright (C) 2012 Salvatore Sanfilippo. All rights reserved.
|
106
|
+
|
107
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
108
|
+
a copy of this software and associated documentation files (the
|
109
|
+
"Software"), to deal in the Software without restriction, including
|
110
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
111
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
112
|
+
permit persons to whom the Software is furnished to do so, subject to
|
113
|
+
the following conditions:
|
114
|
+
|
115
|
+
The above copyright notice and this permission notice shall be
|
116
|
+
included in all copies or substantial portions of the Software.
|
117
|
+
|
118
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
119
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
120
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
121
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
122
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
123
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
124
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
125
|
+
|
126
|
+
This product includes content covered by the following license:
|
127
|
+
Copyright (c) 2007-2015 Mitchell
|
128
|
+
|
129
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
130
|
+
of this software and associated documentation files (the "Software"), to deal
|
131
|
+
in the Software without restriction, including without limitation the rights
|
132
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
133
|
+
copies of the Software, and to permit persons to whom the Software is
|
134
|
+
furnished to do so, subject to the following conditions:
|
135
|
+
|
136
|
+
The above copyright notice and this permission notice shall be included in
|
137
|
+
all copies or substantial portions of the Software.
|
138
|
+
|
139
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
140
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
141
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
142
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
143
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
144
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
145
|
+
THE SOFTWARE.
|
146
|
+
|
147
|
+
This product includes content covered by the following license:
|
148
|
+
Copyright (c) 2012, Daniel Lindsley
|
149
|
+
All rights reserved.
|
150
|
+
|
151
|
+
Redistribution and use in source and binary forms, with or without
|
152
|
+
modification, are permitted provided that the following conditions are met:
|
153
|
+
|
154
|
+
* Redistributions of source code must retain the above copyright notice, this
|
155
|
+
list of conditions and the following disclaimer.
|
156
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
157
|
+
this list of conditions and the following disclaimer in the documentation
|
158
|
+
and/or other materials provided with the distribution.
|
159
|
+
* Neither the name of the base64 nor the names of its contributors may be
|
160
|
+
used to endorse or promote products derived from this software without
|
161
|
+
specific prior written permission.
|
162
|
+
|
163
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
164
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
165
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
166
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
167
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
168
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
169
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
170
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
171
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
172
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
173
|
+
|
174
|
+
This product includes content covered by the following license:
|
175
|
+
Copyright (c) 2012 codingow.com
|
176
|
+
|
177
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
178
|
+
a copy of this software and associated documentation files (the
|
179
|
+
"Software"), to deal in the Software without restriction, including
|
180
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
181
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
182
|
+
permit persons to whom the Software is furnished to do so, subject to
|
183
|
+
the following conditions:
|
184
|
+
|
185
|
+
The above copyright notice and this permission notice shall be included
|
186
|
+
in all copies or substantial portions of the Software.
|
187
|
+
|
188
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
189
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
190
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
191
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
192
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
193
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
194
|
+
DEALINGS IN THE SOFTWARE.
|
195
|
+
|
196
|
+
|
197
|
+
All other components of this product are
|
198
|
+
Copyright (c) 2015 Immunio, Inc. All rights reserved.
|
199
|
+
|
200
|
+
Certain inventions disclosed in this file may be claimed within
|
201
|
+
patents owned or patent applications filed by Immunio, Inc. or third
|
202
|
+
parties.
|
203
|
+
|
204
|
+
Subject to the terms of this notice, Immunio grants you a
|
205
|
+
nonexclusive, nontransferable license, without the right to
|
206
|
+
sublicense, to (a) install and execute one copy of these files on any
|
207
|
+
number of workstations owned or controlled by you and (b) distribute
|
208
|
+
verbatim copies of these files to third parties. As a condition to the
|
209
|
+
foregoing grant, you must provide this notice along with each copy you
|
210
|
+
distribute and you must not remove, alter, or obscure this notice. All
|
211
|
+
other use, reproduction, modification, distribution, or other
|
212
|
+
exploitation of these files is strictly prohibited, except as may be set
|
213
|
+
forth in a separate written license agreement between you and Immunio.
|
214
|
+
The terms of any such license agreement will control over this
|
215
|
+
notice. The license stated above will be automatically terminated and
|
216
|
+
revoked if you exceed its scope or violate any of the terms of this
|
217
|
+
notice.
|
218
|
+
|
219
|
+
This License does not grant permission to use the trade names,
|
220
|
+
trademarks, service marks, or product names of Immunio, except as
|
221
|
+
required for reasonable and customary use in describing the origin of
|
222
|
+
this file and reproducing the content of this notice. You may not
|
223
|
+
mark or brand this file with any trade name, trademarks, service
|
224
|
+
marks, or product names other than the original brand (if any)
|
225
|
+
provided by Immunio.
|
226
|
+
|
227
|
+
Unless otherwise expressly agreed by Immunio in a separate written
|
228
|
+
license agreement, these files are provided AS IS, WITHOUT WARRANTY OF
|
229
|
+
ANY KIND, including without any implied warranties of MERCHANTABILITY,
|
230
|
+
FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT. As a
|
231
|
+
condition to your use of these files, you are solely responsible for
|
232
|
+
such use. Immunio will have no liability to you for direct,
|
233
|
+
indirect, consequential, incidental, special, or punitive damages or
|
234
|
+
for lost profits or data.
|
data/README.md
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
# Immunio Ruby Agent
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
Add the private Immunio Gemfury repo and the gem itself to your Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'immunio', source: 'https://6kxysjCKxsZz3uR6wgas@gem.fury.io/immunio/'
|
9
|
+
```
|
10
|
+
|
11
|
+
Run Bundler to install the gem:
|
12
|
+
|
13
|
+
```sh
|
14
|
+
bundle install
|
15
|
+
```
|
16
|
+
|
17
|
+
Note that if your application is not using Bundler, require the Immunio package:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
require 'immunio'
|
21
|
+
```
|
22
|
+
|
23
|
+
## Configuration
|
24
|
+
|
25
|
+
The agent key and secret can be configured via the `IMMUNIO_KEY` and `IMMUNIO_SECRET` environment variables.
|
26
|
+
|
27
|
+
Optionally, a configuration file can be provided in *config/immunio.yml* which will take precedence over the environment variables:
|
28
|
+
|
29
|
+
```yaml
|
30
|
+
key: "my-key"
|
31
|
+
secret: "my-secret"
|
32
|
+
```
|
33
|
+
|
34
|
+
The Immunio agent is enabled by default in all rails environments. It can be enabled in production only in your Gemfile:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
gem immunio', group: :production
|
38
|
+
```
|
39
|
+
|
40
|
+
You can also modify the secret and key for different environments to report to different apps, or you can disable the agent by setting `agent_enabled: false` in the configuration or `IMMUNIO_AGENT_ENABLED=0` in the environment.
|
41
|
+
|
42
|
+
## Handling blocked requests
|
43
|
+
|
44
|
+
By default, Immunio will return a plain text *403 Forbidden* response whenever it blocks a request for security reasons.
|
45
|
+
|
46
|
+
To customize this behavior, use the `Immunio.blocked_app` option, which should be a valid [Rack application](http://rack.github.io/):
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
Immunio.blocked_app = -> env do
|
50
|
+
[
|
51
|
+
403,
|
52
|
+
{ 'Content-Type' => 'text/html' },
|
53
|
+
ActionController::DataStreaming::FileBody.new('public/403.html')
|
54
|
+
]
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
## Authentication API
|
59
|
+
|
60
|
+
If you're using [Devise](https://github.com/plataformatec/devise) or [Authlogic](https://github.com/binarylogic/authlogic), Immunio will automatically hook into your authentication system to protect you against attacks.
|
61
|
+
|
62
|
+
If you're not using one of the above frameworks, you will need to manually tell Immunio when authentication occurs. Use the following methods to do so.
|
63
|
+
|
64
|
+
- After a user logs in: `Immunio.login user`
|
65
|
+
- After a failed login attempt: `Immunio.failed_login`
|
66
|
+
- After a user logs out: `Immunio.logout`
|
67
|
+
- After the current user is changed (or set): `Immunio.set_user`
|
68
|
+
- After a user requests a password reset: `Immunio.password_reset`
|
69
|
+
- After a failed requests for resetting a password: `Immunio.failed_password_reset`
|
70
|
+
|
71
|
+
**Note:** `Immunio.set_user` should be called for every request where user data is available, not just when authentication mechanisms are used.
|
72
|
+
|
73
|
+
These methods take an options hash with the following information:
|
74
|
+
|
75
|
+
* user_id: String or Number
|
76
|
+
* username: String
|
77
|
+
* email: String
|
78
|
+
* user_record: ActiveRecord object for the user
|
79
|
+
* reason: String (for failures)
|
80
|
+
|
81
|
+
Here's an example:
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
class ApplicationController
|
85
|
+
def current_user=(user)
|
86
|
+
Immunio.set_user user_record: user
|
87
|
+
# Store user ...
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class SessionsController < ApplicationController
|
92
|
+
# POST /login
|
93
|
+
def create
|
94
|
+
if user = User.authenticate(params[:user])
|
95
|
+
Immunio.login user_record: user
|
96
|
+
self.current_user = user
|
97
|
+
# ...
|
98
|
+
else
|
99
|
+
Immunio.failed_login username: params[:user]
|
100
|
+
# ...
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# DELETE /logout
|
105
|
+
def destroy
|
106
|
+
Immunio.logout user_record: current_user
|
107
|
+
# ...
|
108
|
+
end
|
109
|
+
end
|
110
|
+
```
|
111
|
+
|
112
|
+
## Support
|
113
|
+
|
114
|
+
- Ruby 2.0 and up
|
115
|
+
- Rails 3.2 to 4.2
|
116
|
+
|
117
|
+
## Building the gem
|
118
|
+
|
119
|
+
To build the pure Ruby gem:
|
120
|
+
|
121
|
+
```sh
|
122
|
+
$ rake gem
|
123
|
+
```
|
124
|
+
|
125
|
+
To build with bundled pre-compiled C extensions:
|
126
|
+
|
127
|
+
```sh
|
128
|
+
$ rake native gem
|
129
|
+
```
|
130
|
+
|
131
|
+
For cross-compilation, see https://github.com/luislavena/rake-compiler#cross-compilation---the-future-is-now.
|
132
|
+
|
133
|
+
## Testing
|
134
|
+
|
135
|
+
To run tests (under Rails 4.2):
|
136
|
+
|
137
|
+
```sh
|
138
|
+
$ rake test
|
139
|
+
```
|
140
|
+
|
141
|
+
To run tests under Rails 3.2:
|
142
|
+
|
143
|
+
```sh
|
144
|
+
$ export RAILS_VERSION=3.2
|
145
|
+
$ bundle update rails
|
146
|
+
$ rake test
|
147
|
+
```
|
data/bin/immunio
ADDED
data/lib/immunio.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Immunio
|
2
|
+
DIR = File.expand_path(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
def self.activate!
|
5
|
+
require_relative "immunio/agent"
|
6
|
+
require_relative "immunio/authentication"
|
7
|
+
|
8
|
+
agent # Force load agent
|
9
|
+
end
|
10
|
+
|
11
|
+
# Load plugins (after agent is loaded)
|
12
|
+
def self.activate_plugins!
|
13
|
+
require_relative "immunio/plugins/action_view"
|
14
|
+
# NOTE immunio/plugins/active_record is loaded after ActiveRecord is configured in rails.rb
|
15
|
+
require_relative "immunio/plugins/action_dispatch"
|
16
|
+
require_relative "immunio/plugins/csrf"
|
17
|
+
require_relative "immunio/plugins/io"
|
18
|
+
require_relative "immunio/plugins/devise"
|
19
|
+
require_relative "immunio/plugins/warden"
|
20
|
+
require_relative "immunio/plugins/authlogic"
|
21
|
+
require_relative "immunio/plugins/redirect"
|
22
|
+
require_relative "immunio/plugins/eval"
|
23
|
+
|
24
|
+
# Load and activate Rails engine
|
25
|
+
require_relative "immunio/rails"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Immunio.activate!
|
@@ -0,0 +1,260 @@
|
|
1
|
+
require "set"
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
require_relative "channel"
|
5
|
+
require_relative "processor"
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
module Immunio
|
10
|
+
@agent = nil
|
11
|
+
|
12
|
+
# Plugins that are enabled by default. Override using the `plugins_enabled`
|
13
|
+
# and `plugins_disabled` configuration settings.
|
14
|
+
DEFAULT_PLUGINS = ["xss", "file_io", "redirect", "sqli", "eval", "shell_command"]
|
15
|
+
|
16
|
+
CONFIG_FILENAME = "immunio.yml"
|
17
|
+
|
18
|
+
class Agent
|
19
|
+
include ActiveSupport::Configurable
|
20
|
+
|
21
|
+
# These configuration accessors will be available via the `config` method.
|
22
|
+
# NB: :key must be accessed using config[:key] and not config.key
|
23
|
+
config_accessor :key, :secret
|
24
|
+
|
25
|
+
config_accessor :hello_url
|
26
|
+
|
27
|
+
config_accessor :log_file
|
28
|
+
config_accessor :log_level
|
29
|
+
config_accessor :log_timings
|
30
|
+
config_accessor :log_context_data
|
31
|
+
|
32
|
+
config_accessor :http_timeout
|
33
|
+
|
34
|
+
config_accessor :max_send_queue_size
|
35
|
+
config_accessor :max_report_interval
|
36
|
+
config_accessor :min_report_size
|
37
|
+
config_accessor :max_report_size
|
38
|
+
config_accessor :max_report_bytes
|
39
|
+
|
40
|
+
# These two values control the exponential backoff behaviour during
|
41
|
+
# communication failure.
|
42
|
+
config_accessor :initial_delay_ms
|
43
|
+
config_accessor :max_delay_ms
|
44
|
+
|
45
|
+
# How long should the Agent wait for the Immunio Service to provide an
|
46
|
+
# initial ruleset. Any "Falsy" value means don't wait at all.
|
47
|
+
config_accessor :ready_timeout
|
48
|
+
|
49
|
+
# Control which plugins will be enabled on startup.
|
50
|
+
# `plugins_active` contains the default list of plugins. Other plugins
|
51
|
+
# can be added to the list by putting them in `plugins_enabled` or
|
52
|
+
# removed from the list by adding the to `plugins_disabled`.
|
53
|
+
config_accessor :plugins_active
|
54
|
+
config_accessor :plugins_disabled
|
55
|
+
config_accessor :plugins_enabled
|
56
|
+
|
57
|
+
# Set to `true` to enable automatic reloading of hook handlers from files.
|
58
|
+
config_accessor :dev_mode
|
59
|
+
|
60
|
+
# Set to `true` to enable lua debugging urls etc.
|
61
|
+
config_accessor :debug_mode
|
62
|
+
|
63
|
+
# Set to `false` to disable the agent.
|
64
|
+
config_accessor :agent_enabled
|
65
|
+
|
66
|
+
# Set to an array of safe methods for creating ActiveSupport::SafeBuffers
|
67
|
+
# with script tags.
|
68
|
+
config_accessor :safe_script_tag_contexts
|
69
|
+
|
70
|
+
# Any settings specified in vm_data are used to override agent
|
71
|
+
# configuration returned from the server. Mostly used for debugging
|
72
|
+
# purposes.
|
73
|
+
config_accessor :vm_data
|
74
|
+
|
75
|
+
def initialize
|
76
|
+
Immunio.logger.info "Initializing agent version #{VERSION} for process #{Process.pid}"
|
77
|
+
|
78
|
+
config.key = config.secret = "-default-"
|
79
|
+
config.hello_url = "https://agent.immun.io/"
|
80
|
+
config.log_file = "log/immunio.log"
|
81
|
+
config.log_level = "info"
|
82
|
+
config.log_timings = false
|
83
|
+
config.log_context_data = false
|
84
|
+
config.http_timeout = 30 # seconds
|
85
|
+
config.max_send_queue_size = 500 # messages
|
86
|
+
config.max_report_interval = 10 # seconds
|
87
|
+
config.min_report_size = 25 # messages
|
88
|
+
config.max_report_size = 50 # messages
|
89
|
+
config.max_report_bytes = 1500000 # Just shy of 1.5 megs
|
90
|
+
config.initial_delay_ms = 100 # milliseconds
|
91
|
+
config.max_delay_ms = 10 * 60 * 1000 # milliseconds
|
92
|
+
config.dev_mode = false
|
93
|
+
config.debug_mode = false
|
94
|
+
config.ready_timeout = 0
|
95
|
+
# Default list of active plugins
|
96
|
+
config.plugins_active = DEFAULT_PLUGINS.to_set
|
97
|
+
# Default to empty lists for enabled and disabled
|
98
|
+
config.plugins_enabled = []
|
99
|
+
config.plugins_disabled = []
|
100
|
+
config.agent_enabled = true
|
101
|
+
config.safe_script_tag_contexts = []
|
102
|
+
config.vm_data = {}
|
103
|
+
|
104
|
+
# Be sure all config attributes have a type before this call:
|
105
|
+
load_config
|
106
|
+
|
107
|
+
Immunio::switch_to_real_logger(config.log_file, config.log_level)
|
108
|
+
|
109
|
+
if !config.agent_enabled then
|
110
|
+
Immunio.logger.info "Agent disabled in config"
|
111
|
+
return
|
112
|
+
end
|
113
|
+
|
114
|
+
@vmfactory = VMFactory.new(config[:key], config.secret, config.dev_mode,
|
115
|
+
config.debug_mode)
|
116
|
+
|
117
|
+
@channel = Channel.new(config)
|
118
|
+
@channel.on_sending do
|
119
|
+
@vmfactory.current_state
|
120
|
+
end
|
121
|
+
|
122
|
+
# Link things together. The vmfactory needs to know about updates
|
123
|
+
# to the code and data, and the channel needs to know when everything
|
124
|
+
# is up to date.
|
125
|
+
have_code = config.dev_mode
|
126
|
+
have_data = false
|
127
|
+
@channel.on_message do |message|
|
128
|
+
case message[:type]
|
129
|
+
when "engine.vm.code.update"
|
130
|
+
# Don't update code in dev_mode
|
131
|
+
unless config.dev_mode
|
132
|
+
@vmfactory.update_code message[:version], message[:code]
|
133
|
+
have_code = true
|
134
|
+
if have_data
|
135
|
+
@channel.set_ready
|
136
|
+
end
|
137
|
+
end
|
138
|
+
when "engine.vm.data.update"
|
139
|
+
@vmfactory.update_data message[:version], message[:data]
|
140
|
+
have_data = true
|
141
|
+
if have_code
|
142
|
+
@channel.set_ready
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
@processor = Processor.new(@channel, @vmfactory, config)
|
148
|
+
end
|
149
|
+
|
150
|
+
def load_config
|
151
|
+
Immunio.logger.debug "Default configuration: #{config}"
|
152
|
+
|
153
|
+
# Try loading file from some standard locations. First match is used.
|
154
|
+
locations = []
|
155
|
+
locations << Rails.root.join("config", CONFIG_FILENAME) if defined?(Rails.root) && Rails.root
|
156
|
+
locations << File.join("config", CONFIG_FILENAME)
|
157
|
+
|
158
|
+
locations.each do |location|
|
159
|
+
Immunio.logger.debug "Trying to find config file at #{location}"
|
160
|
+
begin
|
161
|
+
realpath = File.realpath(location) # Raises exception if file doesn't exist
|
162
|
+
Immunio.logger.debug "Found config file at #{realpath}"
|
163
|
+
options = YAML.load_file(realpath).symbolize_keys
|
164
|
+
config.update options
|
165
|
+
Immunio.logger.debug "Configuration after loading from file: #{config}"
|
166
|
+
break
|
167
|
+
rescue SystemCallError => e
|
168
|
+
Immunio.logger.debug "Failed to load config: #{e}"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Load private config from env vars.
|
173
|
+
# Set the type of the same as set in initialize
|
174
|
+
config.keys.each do |key|
|
175
|
+
if ENV["IMMUNIO_#{key.upcase}"] then
|
176
|
+
new_value = ENV["IMMUNIO_#{key.upcase}"]
|
177
|
+
case config[key]
|
178
|
+
when String
|
179
|
+
config[key] = new_value
|
180
|
+
when Fixnum
|
181
|
+
config[key] = Integer(new_value)
|
182
|
+
when TrueClass, FalseClass
|
183
|
+
config[key] = !(new_value =~ (/^(true|t|yes|y|1)$/i)).nil?
|
184
|
+
when Array
|
185
|
+
config[key] = new_value.split(/[\s,]+/)
|
186
|
+
when Set
|
187
|
+
config[key] = new_value.split(/[\s,]+/).to_set
|
188
|
+
else
|
189
|
+
raise ArgumentError, "Unknown ENV conversion for #{config[key].class}"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
Immunio.logger.debug "Configuration after evaluating env vars: #{config}"
|
195
|
+
|
196
|
+
# Remove any requested plugins, then add any requested plugins.
|
197
|
+
config.plugins_active.subtract(config.plugins_disabled)
|
198
|
+
config.plugins_active.merge(config.plugins_enabled)
|
199
|
+
Immunio.logger.info "Active plugins: #{config.plugins_active.to_a}"
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
def plugin_enabled?(plugin)
|
204
|
+
# Check if the specified `plugin` is enabled based on the Agent config.
|
205
|
+
config.plugins_active.member?(plugin)
|
206
|
+
end
|
207
|
+
|
208
|
+
def new_request(*args)
|
209
|
+
@processor.new_request(*args)
|
210
|
+
end
|
211
|
+
|
212
|
+
def finish_request(*args)
|
213
|
+
@processor.finish_request(*args)
|
214
|
+
end
|
215
|
+
|
216
|
+
def run_hook(*args)
|
217
|
+
@processor.run_hook(*args) if defined? @processor
|
218
|
+
end
|
219
|
+
|
220
|
+
def run_hook!(*args)
|
221
|
+
@processor.run_hook!(*args) if defined? @processor
|
222
|
+
end
|
223
|
+
|
224
|
+
def environment=(environment)
|
225
|
+
@processor.environment = environment
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
AGENT_INIT_MUTEX = Mutex.new
|
230
|
+
def self.agent
|
231
|
+
return @agent if @agent
|
232
|
+
|
233
|
+
AGENT_INIT_MUTEX.synchronize do
|
234
|
+
@agent = Agent.new
|
235
|
+
activate_plugins! if @agent.agent_enabled
|
236
|
+
end
|
237
|
+
|
238
|
+
@agent
|
239
|
+
end
|
240
|
+
|
241
|
+
def self.new_request(*args)
|
242
|
+
agent.new_request(*args)
|
243
|
+
end
|
244
|
+
|
245
|
+
def self.finish_request(*args)
|
246
|
+
agent.finish_request(*args)
|
247
|
+
end
|
248
|
+
|
249
|
+
def self.run_hook(*args)
|
250
|
+
agent.run_hook(*args)
|
251
|
+
end
|
252
|
+
|
253
|
+
def self.run_hook!(*args)
|
254
|
+
# Don't run hooks if we're starting up the agent and opening a log
|
255
|
+
agent.run_hook!(*args) unless !@agent && args[0] == "io" && args[1] == "open"
|
256
|
+
end
|
257
|
+
|
258
|
+
# Initialize startup logger now!
|
259
|
+
create_startup_logger
|
260
|
+
end
|