cloudbleed_checker 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4c1548f17695cf2dfa7eb0360146ad326afa11bd
4
+ data.tar.gz: fbd4403704954c7cc4a53a3a7d352df83c9a3706
5
+ SHA512:
6
+ metadata.gz: 13bbfde323493a78392d3407aaab2334f9ce302baaebe68b22b6d8a847cc47572dedc8ef59ec6f7f0eba85bcbe7514878f1c8088d563d098e2b57083575d0fa7
7
+ data.tar.gz: a0d0da1f142d8562f1327aa87c69334a1c26774c004f760c95f5453b82fd5c223a528b8bb0608488133bea94ed2c4d32adea3f0d05039f582eae03cda808b599
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ before_install: gem install bundler -v 1.14.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cloudbleed_checker.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # CloudbleedChecker
2
+
3
+ A utility to check your browser history for any sites hosted by Cloudflare,
4
+ this will give you an easy way to determine where you need to change your
5
+ password.
6
+
7
+ ## Installation
8
+
9
+ `$ gem install cloudbleed_checker`
10
+
11
+ ## Usage
12
+
13
+ `cloudbleed check`
14
+
15
+ The output from that command will include a bit of diagnostic info and a list
16
+ of sites you've visited since the security vulnerabilities were introduced
17
+ and are fronted by Cloudflare.
18
+
19
+ ## Development
20
+
21
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
22
+
23
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
24
+
25
+ ## Contributing
26
+
27
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Tyler Pickett/cloudbleed_checker.
28
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "cloudbleed_checker"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cloudbleed_checker/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cloudbleed_checker"
8
+ spec.version = CloudbleedChecker::VERSION
9
+ spec.authors = ["Tyler Pickett"]
10
+ spec.email = ["t.pickett66@gmail.com"]
11
+
12
+ spec.summary = %q{A utility to check your browser history for cloudflare hosted sites}
13
+ spec.description = %q{A utility to check your browser history for cloudflare hosted sites}
14
+ spec.homepage = "https://github.com/tpickett66/cloudbleed_checker"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_dependency "bundler", "~> 1.14"
24
+ spec.add_dependency "thor", "~> 0.19"
25
+ spec.add_dependency "sequel", "~> 4.43"
26
+ spec.add_dependency "sqlite3", "~> 1.3"
27
+
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rspec", "~> 3.0"
30
+ end
data/exe/cloudbleed ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'cloudbleed_checker'
5
+
6
+ CloudbleedChecker::CLI.start
@@ -0,0 +1,64 @@
1
+ require 'fileutils'
2
+ require 'set'
3
+ require 'sequel'
4
+ require 'sqlite3'
5
+ require 'uri'
6
+
7
+ module CloudbleedChecker
8
+ class Browser
9
+ class << self
10
+ attr_accessor :history_db_path
11
+ attr_accessor :history_db_glob
12
+
13
+ def extract_domains(tmpdir)
14
+ new(tmpdir).extract_domains
15
+ end
16
+ end
17
+
18
+ def initialize(tmpdir)
19
+ @tmpdir = tmpdir
20
+ @hosts = Set.new
21
+ end
22
+
23
+ def extract_hosts(dataset, url_key)
24
+ dataset.paged_each do |row|
25
+ host = extract_host(row, url_key)
26
+ @hosts << host if host
27
+ end
28
+ @hosts
29
+ end
30
+
31
+ def extract_host(row, url_key)
32
+ url = row[url_key]
33
+ return if url.nil?
34
+ URI.parse(url).host
35
+ rescue URI::InvalidURIError => ex
36
+ puts "unable to parse url: '#{row[url_key]}', skipping"
37
+ end
38
+
39
+ def history_db_path
40
+ self.class.history_db_path
41
+ end
42
+
43
+ def history_db_glob
44
+ self.class.history_db_glob
45
+ end
46
+
47
+ def with_database(db_path = history_db_path)
48
+ dest_path = @tmpdir.join(self.class.name)
49
+ FileUtils.cp(File.expand_path(db_path), dest_path)
50
+ db = Sequel.sqlite(dest_path.to_s)
51
+ yield db
52
+ ensure
53
+ db.disconnect if db
54
+ end
55
+
56
+ def with_databases(&block)
57
+ full_glob = File.expand_path(self.history_db_glob)
58
+ Dir.glob(full_glob).each do |db_path|
59
+ with_database(db_path, &block)
60
+ end
61
+ @hosts
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'browser'
2
+ module CloudbleedChecker
3
+ class Chrome < Browser
4
+ TIMESTAMP_MAGIC_NUMBER = 11644473600 # No idea where this came from, should probaby figure that out from the chrome source
5
+ TIMESTAMP_DIVISOR = 1_000_000 # convert usec to seconds
6
+
7
+ self.history_db_glob = "~/Library/Application Support/Google/Chrome/*/History"
8
+
9
+ def extract_domains
10
+ with_databases do |db|
11
+ ds = db[:urls].
12
+ select(:url, :last_visit_time).
13
+ where("(last_visit_time/?) - ? >= ?", TIMESTAMP_DIVISOR, TIMESTAMP_MAGIC_NUMBER, CloudbleedChecker::INITIAL_VULNERABILITY_RELEASED.to_i).
14
+ order(:last_visit_time)
15
+ extract_hosts(ds, :url)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ require 'pathname'
2
+ require 'set'
3
+ require 'tmpdir'
4
+ require 'thor'
5
+ require 'net/http'
6
+ require 'zlib'
7
+
8
+ module CloudbleedChecker
9
+ class CLI < Thor
10
+ desc "check", "Check all supported browsers"
11
+ def check
12
+ Dir.mktmpdir do |tmpdir|
13
+ puts 'Extracting history....'
14
+ tmpdir = Pathname.new(tmpdir)
15
+ domains = Chrome.extract_domains(tmpdir)
16
+ domains.merge(Safari.extract_domains(tmpdir))
17
+ domains.merge(Firefox.extract_domains(tmpdir))
18
+ puts "Extracted #{domains.size} unique hosts from your browser histories"
19
+
20
+ puts 'Checking sites'
21
+ num_checked = 0
22
+ domains_path = File.join(File.dirname(__FILE__), 'domains.gz')
23
+ Zlib::GzipReader.open(domains_path) do |file|
24
+ file.each_line do |domain|
25
+ domain.chomp!
26
+ if domains.include?(domain)
27
+ puts "History included '#{domain}' from list"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ puts "Check complete"
33
+ end
34
+ end
35
+ end
Binary file
@@ -0,0 +1,17 @@
1
+ require_relative 'browser'
2
+
3
+ module CloudbleedChecker
4
+ class Firefox < Browser
5
+ self.history_db_glob = '~/Library/Application Support/Firefox/Profiles/*/places.sqlite'
6
+
7
+ def extract_domains
8
+ with_databases do |db|
9
+ ds = db[:moz_places].
10
+ select('DISTINCT(url), last_visit_date').
11
+ where('last_visit_date >= ?', CloudbleedChecker::INITIAL_VULNERABILITY_RELEASED.to_i).
12
+ order(:last_visit_date)
13
+ extract_hosts(ds, :url)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'browser'
2
+
3
+ module CloudbleedChecker
4
+ class Safari < Browser
5
+ TIMESTAMP_OFFSET = 978307200
6
+
7
+ self.history_db_path = '~/Library/Safari/History.db'
8
+
9
+ def extract_domains
10
+ with_database do |db|
11
+ ds = db[:history_items].
12
+ select('DISTINCT(url), visit_time ').
13
+ join(:history_visits).
14
+ where('visit_time + ? >= ?', TIMESTAMP_OFFSET, CloudbleedChecker::INITIAL_VULNERABILITY_RELEASED.to_i).
15
+ order(:visit_time)
16
+ extract_hosts(ds, :url)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module CloudbleedChecker
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,15 @@
1
+ require 'cloudbleed_checker/chrome'
2
+ require 'cloudbleed_checker/cli'
3
+ require 'cloudbleed_checker/firefox'
4
+ require 'cloudbleed_checker/safari'
5
+ require "cloudbleed_checker/version"
6
+ require 'uri'
7
+
8
+ module CloudbleedChecker
9
+ CLOUDFLARE_SITES_URL = URI.parse('https://raw.githubusercontent.com/pirate/sites-using-cloudflare/master/sorted_unique_cf.txt')
10
+ INITIAL_VULNERABILITY_RELEASED = Date.civil(2016, 9, 22).to_time
11
+
12
+ def data
13
+ DATA
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloudbleed_checker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tyler Pickett
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-02-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.19'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.19'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sequel
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.43'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.43'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ description: A utility to check your browser history for cloudflare hosted sites
98
+ email:
99
+ - t.pickett66@gmail.com
100
+ executables:
101
+ - cloudbleed
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".travis.yml"
108
+ - Gemfile
109
+ - README.md
110
+ - Rakefile
111
+ - bin/console
112
+ - bin/setup
113
+ - cloudbleed_checker.gemspec
114
+ - exe/cloudbleed
115
+ - lib/cloudbleed_checker.rb
116
+ - lib/cloudbleed_checker/browser.rb
117
+ - lib/cloudbleed_checker/chrome.rb
118
+ - lib/cloudbleed_checker/cli.rb
119
+ - lib/cloudbleed_checker/domains.gz
120
+ - lib/cloudbleed_checker/firefox.rb
121
+ - lib/cloudbleed_checker/safari.rb
122
+ - lib/cloudbleed_checker/version.rb
123
+ homepage: https://github.com/tpickett66/cloudbleed_checker
124
+ licenses: []
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.6.8
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: A utility to check your browser history for cloudflare hosted sites
146
+ test_files: []