fuzzer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/fuzzer ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fuzzer'
4
+
5
+ Fuzzer::CLI.start(ARGV)
data/lib/fuzzer.rb ADDED
@@ -0,0 +1,8 @@
1
+ module Fuzzer
2
+ end
3
+
4
+ require 'right_aws'
5
+ require 'sqlite3'
6
+ require 'zumobi'
7
+ require 'fuzzer/version'
8
+ require 'fuzzer/cli'
data/lib/fuzzer/cli.rb ADDED
@@ -0,0 +1,119 @@
1
+ require 'open-uri'
2
+ require 'right_aws'
3
+
4
+ module Fuzzer
5
+
6
+ class CLI
7
+ def self.start(argv)
8
+ url = argv.shift
9
+
10
+ data = YAML::load(File.read("config.yml"));
11
+ if data['secret_access_key'].nil? || data['access_key_id'].nil?
12
+ puts "In this directory, create a config.yml file with the Amazon secret_access_key: <value> and access_key_id: <value>"
13
+ exit(1)
14
+ end
15
+ if (url.nil?)
16
+ puts "Usage: bundle exec fuzzer <url>"
17
+ exit(1)
18
+ end
19
+ unless url =~ /^#{URI::regexp}$/
20
+ puts "I'm not seeing a valid URL here: #{url}"
21
+ exit(1)
22
+ end
23
+
24
+ file_name = CLI.download(url)
25
+ short_name = CLI.gunzip(file_name)
26
+
27
+ # manipulate it
28
+ puts "We can corrupt this database two ways:"
29
+ puts " easy: only currupt data that would come from the feed"
30
+ puts " severe: also corrupt db integrity and delete nodes"
31
+
32
+ begin
33
+ print "e)asy or s)evere? "
34
+ input = gets.chomp
35
+ end while (input != "e" && input != "s")
36
+
37
+ db = SQLite3::Database.new(short_name)
38
+ CLI.fuzz_content(db)
39
+ CLI.fuzz_integrity(db) if input == "s"
40
+
41
+ # Query as to what should be broken?
42
+ final_name = CLI.gzip(short_name)
43
+ upload(data, final_name)
44
+
45
+ rescue Exception => e
46
+ puts "Well, that didn't end well: #{e.message}"
47
+ end
48
+
49
+ private
50
+
51
+ # content_items, content_item_details, that aren't id or *_fk
52
+ # change types, nullify, empty string, etc.
53
+ def self.fuzz_content(db)
54
+ values = ["null", "''", "'true'", "'false'", 0, 1, 4, 4.0, "'This is a very long string * This is a very long string * This is a very long string * This is a very long string * This is a very long string * This is a very long string * This is a very long string * This is a very long string * This is a very long string'"]
55
+
56
+ results = db.query("select * from content_items limit 1")
57
+ cols = results.columns.select { |name| name != "id" && !name.end_with?("_fk") }
58
+
59
+ db.execute("select * from content_items").each do |row|
60
+ (5).times do
61
+ db.execute("update content_items set #{cols.sample} = #{values.sample} where id = #{row[0]}")
62
+ end
63
+ end
64
+ results.close
65
+ end
66
+
67
+ # blobs, android_metadata can also be corrupted.
68
+ # Nodes can be deleted. ids and fks can be nullified.
69
+ # For now, just find and change an app_unique_key
70
+ def self.fuzz_integrity(db)
71
+ rows = db.execute("select app_unique_key from content_items where app_unique_key is not null and app_unique_key != 'Settings' and app_unique_key != 'settings'")
72
+ key = rows.sample
73
+ db.execute("update content_items set title='Fuzzed',app_unique_key='fuzzed' where app_unique_key = ?", key)
74
+ end
75
+
76
+ def self.download(url)
77
+ uri = URI.parse(url)
78
+ file_name = uri.path[uri.path.rindex("/")+1,uri.path.length]
79
+ File.open(file_name, "wb") do |saved_file|
80
+ open(url, 'rb') do |read_file|
81
+ saved_file.write(read_file.read)
82
+ puts "Downloaded: #{url}"
83
+ end
84
+ end
85
+ file_name
86
+ end
87
+
88
+ def self.gunzip(file_name)
89
+ short_name = file_name.gsub('.gz','')
90
+ File.open(short_name, "w+") do |file|
91
+ gunk = File.open(file_name, "rb")
92
+ file.write( Zumobi::GzipReader.un_gzip(gunk.read))
93
+ end
94
+ FileUtils.rm(file_name)
95
+ puts "Gunzipped the db: #{file_name}"
96
+ short_name
97
+ end
98
+
99
+ def self.gzip(file_name)
100
+ new_name = file_name.gsub(".db", ".#{Time.now.to_i.to_s}.db.gz")
101
+ File.open(new_name, "w+") do |file|
102
+ gunk = File.open(file_name, "rb")
103
+ file.write( Zumobi::GzipWriter.gzip(gunk.read))
104
+ end
105
+ FileUtils.rm(file_name)
106
+ puts "Gzipped the db: #{new_name}"
107
+ new_name
108
+ end
109
+
110
+ def self.upload(data, final_name)
111
+ s3 = Rightscale::S3.new(data['access_key_id'], data['secret_access_key'])
112
+ bucket = s3.bucket('media.test.zumobi.net', true)
113
+ key = bucket.key("fuzzed/#{final_name}")
114
+ key.put(File.read(final_name), 'public-read')
115
+ puts "Fuzzed db now available at: http://media.test.zumobi.net/fuzzed/#{final_name}"
116
+ end
117
+ end
118
+
119
+ end
@@ -0,0 +1,3 @@
1
+ module Fuzzer
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,9 @@
1
+ require 'test/unit'
2
+ require 'rubygems' # Tests don't run without this, in 1.8.7 at least.
3
+ require 'fuzzer'
4
+
5
+ class FuzzerTest < Test::Unit::TestCase
6
+ def test_output
7
+ # assert_equal "This is my task".colorize(:color => :green), Fuzzer.new.generate()
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fuzzer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alx Dark
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: right_aws
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: zumobi
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: sqlite3
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: debugger
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Downloads, corrupts, and uploads client sqlite dbs for testing purposes.
79
+ email: alx.dark@zumobi.com
80
+ executables:
81
+ - fuzzer
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - lib/fuzzer/cli.rb
86
+ - lib/fuzzer/version.rb
87
+ - lib/fuzzer.rb
88
+ - test/test_fuzzer.rb
89
+ - bin/fuzzer
90
+ homepage: ''
91
+ licenses: []
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 1.8.23
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Fuzzes client sqlite dbs.
114
+ test_files:
115
+ - test/test_fuzzer.rb