libddwaf 1.0.14.1.0.beta2 → 1.2.1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da5262e02876806999ce83838b67075a41513db863ae2e2516ed5a899a9ce80b
4
- data.tar.gz: 451b6cfcaa9bd3c76a5937d4a41f3ec76a4476b574312806635835f5e4a6aa43
3
+ metadata.gz: ce1d3c829e33bcd555ab89c972cd169aea9faae5d320ab9111d11092e9dcdbc9
4
+ data.tar.gz: '0785423054d10fc757993448985897091037cb97476430d9397089f2f73dc690'
5
5
  SHA512:
6
- metadata.gz: 79607138388c2584af5b81da69ac349184470cc7eb702d2a2a3301e6aa0764b39fca3d537c781a99a3b2d4574df51c1a15d81557f29e4f2d96061cd7232db380
7
- data.tar.gz: 9831bcce3b6f4b7e3f53bb872fcf90443b13cce267d7a4fe765f0639d582633977ae7cd7d1f46523255b6e6069e6d4c54a697b126035ec44cc39c73879ff646f
6
+ metadata.gz: 42ba1288045e98493243f5abfe1bd5c88d955cc6c109210d21fccb45c0f8de84b5d36a0f0e9b073b84c05eb4b63725bb9320f5bf6034d464e0bd4d58bbe42368
7
+ data.tar.gz: 3a28ac0d61aeaff6dbed900eea9b9640550adfd82b585fa717f37abc1c1d5210fda004d0a83682a4d027f00c1d93fffeaced07790faaae15802a0e27166570dc
@@ -172,7 +172,7 @@ jobs:
172
172
  run: docker exec -w "${PWD}" ${{ steps.container.outputs.id }} gem install --verbose pkg/*.gem
173
173
  - name: Run smoke test
174
174
  run: |
175
- docker exec -w "${PWD}" ${{ steps.container.outputs.id }} ruby -r 'libddwaf' -e 'v = Datadog::Security::WAF::LibDDWAF::Version.new; Datadog::Security::WAF::LibDDWAF.ddwaf_get_version(v); p [v[:major], v[:minor], v[:patch]]'
175
+ docker exec -w "${PWD}" ${{ steps.container.outputs.id }} ruby -r 'libddwaf' -e 'v = Datadog::AppSec::WAF::LibDDWAF::Version.new; Datadog::AppSec::WAF::LibDDWAF.ddwaf_get_version(v); p [v[:major], v[:minor], v[:patch]]'
176
176
  test-darwin:
177
177
  needs: package-binary
178
178
  strategy:
@@ -199,4 +199,4 @@ jobs:
199
199
  run: gem install --verbose pkg/*.gem
200
200
  - name: Run smoke test
201
201
  run: |
202
- ruby -r 'libddwaf' -e 'v = Datadog::Security::WAF::LibDDWAF::Version.new; Datadog::Security::WAF::LibDDWAF.ddwaf_get_version(v); p [v[:major], v[:minor], v[:patch]]'
202
+ ruby -r 'libddwaf' -e 'v = Datadog::AppSec::WAF::LibDDWAF::Version.new; Datadog::AppSec::WAF::LibDDWAF.ddwaf_get_version(v); p [v[:major], v[:minor], v[:patch]]'
@@ -1,9 +1,9 @@
1
1
  module Datadog
2
- module Security
2
+ module AppSec
3
3
  module WAF
4
4
  module VERSION
5
- BASE_STRING = '1.0.14'
6
- STRING = "#{BASE_STRING}.1.0.beta2"
5
+ BASE_STRING = '1.2.1'
6
+ STRING = "#{BASE_STRING}.0.0.beta1"
7
7
  MINIMUM_RUBY_VERSION = '2.1'
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  require 'ffi'
2
2
  require 'json'
3
- require 'datadog/security/waf/version'
3
+ require 'datadog/appsec/waf/version'
4
4
 
5
5
  module Datadog
6
- module Security
6
+ module AppSec
7
7
  module WAF
8
8
  module LibDDWAF
9
9
  class Error < StandardError; end
@@ -46,7 +46,7 @@ module Datadog
46
46
  end
47
47
 
48
48
  def self.shared_lib_path
49
- File.join(__dir__, "../../../vendor/libddwaf/libddwaf-#{Datadog::Security::WAF::VERSION::BASE_STRING}-#{local_os}-#{local_cpu}/lib/libddwaf#{shared_lib_extname}")
49
+ File.join(__dir__, "../../../vendor/libddwaf/libddwaf-#{Datadog::AppSec::WAF::VERSION::BASE_STRING}-#{local_os}-#{local_cpu}/lib/libddwaf#{shared_lib_extname}")
50
50
  end
51
51
 
52
52
  ffi_lib [shared_lib_path]
@@ -73,6 +73,25 @@ module Datadog
73
73
  :ddwaf_obj_map, 1 << 4
74
74
 
75
75
  typedef :pointer, :charptr
76
+ typedef :pointer, :charptrptr
77
+
78
+ class UInt32Ptr < ::FFI::Struct
79
+ layout :value, :uint32
80
+ end
81
+
82
+ typedef UInt32Ptr.by_ref, :uint32ptr
83
+
84
+ class UInt64Ptr < ::FFI::Struct
85
+ layout :value, :uint64
86
+ end
87
+
88
+ typedef UInt64Ptr.by_ref, :uint64ptr
89
+
90
+ class SizeTPtr < ::FFI::Struct
91
+ layout :value, :size_t
92
+ end
93
+
94
+ typedef SizeTPtr.by_ref, :sizeptr
76
95
 
77
96
  class ObjectValueUnion < ::FFI::Union
78
97
  layout :stringValue, :charptr,
@@ -91,6 +110,8 @@ module Datadog
91
110
 
92
111
  typedef Object.by_ref, :ddwaf_object
93
112
 
113
+ ## setters
114
+
94
115
  attach_function :ddwaf_object_invalid, [:ddwaf_object], :ddwaf_object
95
116
  attach_function :ddwaf_object_string, [:ddwaf_object, :string], :ddwaf_object
96
117
  attach_function :ddwaf_object_stringl, [:ddwaf_object, :charptr, :size_t], :ddwaf_object
@@ -108,6 +129,19 @@ module Datadog
108
129
  attach_function :ddwaf_object_map_addl, [:ddwaf_object, :charptr, :size_t, :pointer], :bool
109
130
  attach_function :ddwaf_object_map_addl_nc, [:ddwaf_object, :charptr, :size_t, :pointer], :bool
110
131
 
132
+ ## getters
133
+
134
+ attach_function :ddwaf_object_type, [:ddwaf_object], DDWAF_OBJ_TYPE
135
+ attach_function :ddwaf_object_size, [:ddwaf_object], :uint64
136
+ attach_function :ddwaf_object_length, [:ddwaf_object], :size_t
137
+ attach_function :ddwaf_object_get_key, [:ddwaf_object, :sizeptr], :charptr
138
+ attach_function :ddwaf_object_get_string, [:ddwaf_object, :sizeptr], :charptr
139
+ attach_function :ddwaf_object_get_unsigned, [:ddwaf_object], :uint64
140
+ attach_function :ddwaf_object_get_signed, [:ddwaf_object], :int64
141
+ attach_function :ddwaf_object_get_index, [:ddwaf_object, :size_t], :ddwaf_object
142
+
143
+ ## freeers
144
+
111
145
  ObjectFree = attach_function :ddwaf_object_free, [:ddwaf_object], :void
112
146
  ObjectNoFree = ::FFI::Pointer::NULL
113
147
 
@@ -118,16 +152,27 @@ module Datadog
118
152
 
119
153
  class Config < ::FFI::Struct
120
154
  layout :maxArrayLength, :uint64,
121
- :maxMapDepth, :uint64,
122
- :maxTimeStore, :uint64
155
+ :maxMapDepth, :uint64
123
156
  end
124
157
 
125
158
  typedef Config.by_ref, :ddwaf_config
126
159
 
127
- attach_function :ddwaf_init, [:ddwaf_rule, :ddwaf_config], :ddwaf_handle
160
+ class RuleSetInfo < ::FFI::Struct
161
+ layout :loaded, :uint16,
162
+ :failed, :uint16,
163
+ :errors, Object,
164
+ :version, :string
165
+ end
166
+
167
+ typedef RuleSetInfo.by_ref, :ddwaf_ruleset_info
168
+ RuleSetInfoNone = Datadog::AppSec::WAF::LibDDWAF::RuleSetInfo.new(::FFI::Pointer::NULL)
169
+
170
+ attach_function :ddwaf_ruleset_info_free, [:ddwaf_ruleset_info], :void
171
+
172
+ attach_function :ddwaf_init, [:ddwaf_rule, :ddwaf_config, :ddwaf_ruleset_info], :ddwaf_handle
128
173
  attach_function :ddwaf_destroy, [:ddwaf_handle], :void
129
174
 
130
- attach_function :ddwaf_required_addresses, [:ddwaf_handle, :pointer], :pointer
175
+ attach_function :ddwaf_required_addresses, [:ddwaf_handle, :uint32ptr], :charptrptr
131
176
 
132
177
  # running
133
178
 
@@ -138,19 +183,17 @@ module Datadog
138
183
  attach_function :ddwaf_context_init, [:ddwaf_handle, :ddwaf_object_free_fn], :ddwaf_context
139
184
  attach_function :ddwaf_context_destroy, [:ddwaf_context], :void
140
185
 
141
- DDWAF_RET_CODE = enum :ddwaf_err_internal, -4,
142
- :ddwaf_err_invalid_object, -3,
143
- :ddwaf_err_invalid_argument, -2,
144
- :ddwaf_err_timeout, -1,
186
+ DDWAF_RET_CODE = enum :ddwaf_err_internal, -3,
187
+ :ddwaf_err_invalid_object, -2,
188
+ :ddwaf_err_invalid_argument, -1,
145
189
  :ddwaf_good, 0,
146
190
  :ddwaf_monitor, 1,
147
191
  :ddwaf_block, 2
148
192
 
149
193
  class Result < ::FFI::Struct
150
- layout :action, DDWAF_RET_CODE,
194
+ layout :timeout, :bool,
151
195
  :data, :string,
152
- :perfData, :string,
153
- :perfTotalRuntime, :uint32 # in us
196
+ :total_runtime, :uint64
154
197
  end
155
198
 
156
199
  typedef Result.by_ref, :ddwaf_result
@@ -253,13 +296,7 @@ module Datadog
253
296
 
254
297
  obj
255
298
  else
256
- obj = LibDDWAF::Object.new
257
- res = LibDDWAF.ddwaf_object_invalid(obj)
258
- if res.null?
259
- fail LibDDWAF::Error, "Could not convert into object: #{val}"
260
- end
261
-
262
- obj
299
+ ruby_to_object(''.freeze)
263
300
  end
264
301
  end
265
302
 
@@ -281,8 +318,8 @@ module Datadog
281
318
  end
282
319
  when :ddwaf_obj_map
283
320
  (0...obj[:nbEntries]).each.with_object({}) do |i, h|
284
- ptr = obj[:valueUnion][:array] + i * Datadog::Security::WAF::LibDDWAF::Object.size
285
- o = Datadog::Security::WAF::LibDDWAF::Object.new(ptr)
321
+ ptr = obj[:valueUnion][:array] + i * Datadog::AppSec::WAF::LibDDWAF::Object.size
322
+ o = Datadog::AppSec::WAF::LibDDWAF::Object.new(ptr)
286
323
  l = o[:parameterNameLength]
287
324
  k = o[:parameterName].read_bytes(l)
288
325
  v = object_to_ruby(LibDDWAF::Object.new(ptr))
@@ -293,10 +330,10 @@ module Datadog
293
330
 
294
331
  def self.logger=(logger)
295
332
  @log_cb = proc do |level, func, file, line, message, len|
296
- logger.debug { { level: level, func: func, file: file, message: message.read_bytes(len) }.inspect }
333
+ logger.debug { { level: level, func: func, file: file, line: line, message: message.read_bytes(len) }.inspect }
297
334
  end
298
335
 
299
- Datadog::Security::WAF::LibDDWAF.ddwaf_set_log_cb(@log_cb, :ddwaf_log_trace)
336
+ Datadog::AppSec::WAF::LibDDWAF.ddwaf_set_log_cb(@log_cb, :ddwaf_log_trace)
300
337
  end
301
338
 
302
339
  class Handle
@@ -304,50 +341,51 @@ module Datadog
304
341
 
305
342
  DEFAULT_MAX_ARRAY_LENGTH = 0
306
343
  DEFAULT_MAX_MAP_DEPTH = 0
307
- DEFAULT_MAX_TIME_STORE = 0
308
344
 
309
345
  def initialize(rule, config = {})
310
- rule_obj = Datadog::Security::WAF.ruby_to_object(rule)
346
+ rule_obj = Datadog::AppSec::WAF.ruby_to_object(rule)
311
347
  if rule_obj.null? || rule_obj[:type] == :ddwaf_object_invalid
312
348
  fail LibDDWAF::Error, "Could not convert object #{rule.inspect}"
313
349
  end
314
350
 
315
- config_obj = Datadog::Security::WAF::LibDDWAF::Config.new
351
+ config_obj = Datadog::AppSec::WAF::LibDDWAF::Config.new
316
352
  if config_obj.null?
317
353
  fail LibDDWAF::Error, 'Could not create config struct'
318
354
  end
319
355
 
320
356
  config_obj[:maxArrayLength] = config[:max_array_length] || DEFAULT_MAX_ARRAY_LENGTH
321
357
  config_obj[:maxMapDepth] = config[:max_map_depth] || DEFAULT_MAX_MAP_DEPTH
322
- config_obj[:maxTimeStore] = config[:max_time_store] || DEFAULT_MAX_TIME_STORE
323
358
 
324
- @handle_obj = Datadog::Security::WAF::LibDDWAF.ddwaf_init(rule_obj, config_obj)
359
+ ruleset_info = LibDDWAF::RuleSetInfoNone
360
+
361
+ @handle_obj = Datadog::AppSec::WAF::LibDDWAF.ddwaf_init(rule_obj, config_obj, ruleset_info)
325
362
  if @handle_obj.null?
326
363
  fail LibDDWAF::Error, 'Could not create handle'
327
364
  end
328
365
 
329
366
  ObjectSpace.define_finalizer(self, Handle.finalizer(handle_obj))
330
367
  ensure
331
- Datadog::Security::WAF::LibDDWAF.ddwaf_object_free(rule_obj) if rule_obj
368
+ Datadog::AppSec::WAF::LibDDWAF.ddwaf_ruleset_info_free(ruleset_info) if ruleset_info
369
+ Datadog::AppSec::WAF::LibDDWAF.ddwaf_object_free(rule_obj) if rule_obj
332
370
  end
333
371
 
334
372
  def self.finalizer(handle_obj)
335
373
  proc do |object_id|
336
- Datadog::Security::WAF::LibDDWAF.ddwaf_destroy(handle_obj)
374
+ Datadog::AppSec::WAF::LibDDWAF.ddwaf_destroy(handle_obj)
337
375
  end
338
376
  end
339
377
  end
340
378
 
341
- Result = Struct.new(:action, :data, :perf_data, :perf_total_runtime)
379
+ Result = Struct.new(:action, :data, :total_runtime, :timeout)
342
380
 
343
381
  class Context
344
382
  attr_reader :context_obj
345
383
 
346
384
  def initialize(handle)
347
385
  handle_obj = handle.handle_obj
348
- free_func = Datadog::Security::WAF::LibDDWAF::ObjectNoFree
386
+ free_func = Datadog::AppSec::WAF::LibDDWAF::ObjectNoFree
349
387
 
350
- @context_obj = Datadog::Security::WAF::LibDDWAF.ddwaf_context_init(handle_obj, free_func)
388
+ @context_obj = Datadog::AppSec::WAF::LibDDWAF.ddwaf_context_init(handle_obj, free_func)
351
389
  if @context_obj.null?
352
390
  fail LibDDWAF::Error, 'Could not create context'
353
391
  end
@@ -360,9 +398,9 @@ module Datadog
360
398
  def self.finalizer(context_obj, input_objs)
361
399
  proc do |object_id|
362
400
  input_objs.each do |input_obj|
363
- Datadog::Security::WAF::LibDDWAF.ddwaf_object_free(input_obj)
401
+ Datadog::AppSec::WAF::LibDDWAF.ddwaf_object_free(input_obj)
364
402
  end
365
- Datadog::Security::WAF::LibDDWAF.ddwaf_context_destroy(context_obj)
403
+ Datadog::AppSec::WAF::LibDDWAF.ddwaf_context_destroy(context_obj)
366
404
  end
367
405
  end
368
406
 
@@ -371,19 +409,18 @@ module Datadog
371
409
  ddwaf_err_internal: :err_internal,
372
410
  ddwaf_err_invalid_object: :err_invalid_object,
373
411
  ddwaf_err_invalid_argument: :err_invalid_argument,
374
- ddwaf_err_timeout: :err_invalid_object,
375
412
  ddwaf_good: :good,
376
413
  ddwaf_monitor: :monitor,
377
414
  ddwaf_block: :block,
378
415
  }
379
416
 
380
417
  def run(input, timeout = DEFAULT_TIMEOUT_US)
381
- input_obj = Datadog::Security::WAF.ruby_to_object(input)
418
+ input_obj = Datadog::AppSec::WAF.ruby_to_object(input)
382
419
  if input_obj.null?
383
420
  fail LibDDWAF::Error, "Could not convert input: #{input.inspect}"
384
421
  end
385
422
 
386
- result_obj = Datadog::Security::WAF::LibDDWAF::Result.new
423
+ result_obj = Datadog::AppSec::WAF::LibDDWAF::Result.new
387
424
  if result_obj.null?
388
425
  fail LibDDWAF::Error, "Could not create result object"
389
426
  end
@@ -391,18 +428,18 @@ module Datadog
391
428
  # retain C objects in memory for subsequent calls to run
392
429
  @input_objs << input_obj
393
430
 
394
- code = Datadog::Security::WAF::LibDDWAF.ddwaf_run(@context_obj, input_obj, result_obj, timeout)
431
+ code = Datadog::AppSec::WAF::LibDDWAF.ddwaf_run(@context_obj, input_obj, result_obj, timeout)
395
432
 
396
433
  result = Result.new(
397
- ACTION_MAP_OUT[result_obj[:action]],
434
+ ACTION_MAP_OUT[code],
398
435
  (JSON.parse(result_obj[:data]) if result_obj[:data] != nil),
399
- (JSON.parse(result_obj[:perfData]) if result_obj[:perfData] != nil),
400
- result_obj[:perfTotalRuntime],
436
+ result_obj[:total_runtime],
437
+ result_obj[:timeout],
401
438
  )
402
439
 
403
440
  [ACTION_MAP_OUT[code], result]
404
441
  ensure
405
- Datadog::Security::WAF::LibDDWAF.ddwaf_result_free(result_obj) if result_obj
442
+ Datadog::AppSec::WAF::LibDDWAF.ddwaf_result_free(result_obj) if result_obj
406
443
  end
407
444
  end
408
445
  end
data/lib/libddwaf.rb CHANGED
@@ -1 +1 @@
1
- require 'datadog/security/waf'
1
+ require 'datadog/appsec/waf'
data/libddwaf.gemspec CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  lib = File.expand_path('../lib', __FILE__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'datadog/security/waf/version'
5
+ require 'datadog/appsec/waf/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'libddwaf'
9
- spec.version = Datadog::Security::WAF::VERSION::STRING
10
- spec.required_ruby_version = [">= #{Datadog::Security::WAF::VERSION::MINIMUM_RUBY_VERSION}"]
9
+ spec.version = Datadog::AppSec::WAF::VERSION::STRING
10
+ spec.required_ruby_version = [">= #{Datadog::AppSec::WAF::VERSION::MINIMUM_RUBY_VERSION}"]
11
11
  spec.required_rubygems_version = '>= 2.0.0'
12
12
  spec.authors = ['Datadog, Inc.']
13
13
  spec.email = ['dev@datadoghq.com']
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libddwaf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.14.1.0.beta2
4
+ version: 1.2.1.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-01 00:00:00.000000000 Z
11
+ date: 2022-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -43,8 +43,8 @@ files:
43
43
  - LICENSE.BSD3
44
44
  - NOTICE
45
45
  - README.md
46
- - lib/datadog/security/waf.rb
47
- - lib/datadog/security/waf/version.rb
46
+ - lib/datadog/appsec/waf.rb
47
+ - lib/datadog/appsec/waf/version.rb
48
48
  - lib/libddwaf.rb
49
49
  - libddwaf.gemspec
50
50
  homepage: https://github.com/DataDog/libddwaf