Parsing CVSS vector and publishing as API

Latest July I wrote a post about having fun with grape framework to build powerful APIs.

Today I used to put my public api website to the next level.

Restyled

Today I finally configured an index.html page with some touch of twitter bootstrap css and very basic information to quick start using the twos api I published as far as today.

The idea is to put all useful opensource code I write on the Internet to be used as API.

CVSS Parsing

Some days ago I faced a problem. A commercial IT solution with all it’s bells and whistles wasn’t able to parse CVSS vector string to tell me the vulnerability impact over my data.

So I decided to write a small rubygem to automate CVSS string parsing.

Parser is provided by a Cvss::Parser module and a parse method leaving all other facilities as private. For now only the base CVSS vector has been successfully parsed.

``` ruby Cvss::Parser module Cvss module Parser

attr_reader :base

# It parses a string and it says if it's a good CVSS vector or not.
def parse(string)
  @base = {}

  toks = string.split("/")
  return parse_base(toks)
end


private
# AV:N/AC:L/Au:N/C:N/I:N/A:C
def parse_base(tokens)
  return false if tokens.count != 6
  av = tokens[0].split(":")
  return false if av.count != 2 or av[0] != "AV" or (av[1] != "N" and av[1] != "L" and av[1] != "A")

  ac = tokens[1].split(":")
  return false if ac.count != 2 or ac[0] != "AC" or (ac[1] != "H" and ac[1] != "M" and ac[1] != "L")
  au = tokens[2].split(":")

  return false if au.count != 2 or au[0] != "Au" or (au[1] != "M" and au[1] != "S" and au[1] != "N")

  c = tokens[3].split(":")
  return false if c.count != 2 or c[0] != "C" or (c[1] != "P" and c[1] != "C" and c[1] != "N")

  i = tokens[4].split(":")
  return false if i.count != 2 or i[0] != "I" or (i[1] != "P" and i[1] != "C" and i[1] != "N")
  
  a = tokens[5].split(":")
  return false if a.count != 2 or a[0] != "A" or (a[1] != "P" and a[1] != "C" and a[1] != "N")


  
  
  @base = {:av=>av[1], :ac=>ac[1], :au=>au[1], :c=>c[1], :i=>i[1], :a=>a[1]}
  true
end   end end ```

Some helpers were also provided to give some human friendly touch to the class:

``` ruby Cvss::Helpers module Cvss module Helpers def data_integrity @base[:i] end def data_confidentiality @base[:c] end def data_availability @base[:a] end end end


And the engine class is very basic:

``` ruby Cvss::Engine
require "cvss/version"
require 'cvss/parser'
require 'cvss/helpers'

module Cvss 
  class Engine
    include Cvss::Parser
    include Cvss::Helpers

  end
end

That’s it so easy to use. You just use the parse method and then retrieve the base vector stored as an Hash.

Publishing it as an API

Publishing my CVSS parsing vector as API it’s so easy with grape.

You just this code in your grape application file:

``` ruby My grape application desc ‘Parse CVSS vector’ namespace :cvss do post do vector = request.params[“vector”] unless request.params[“vector”].nil? cvss = Cvss::Engine.new cvss.base.to_json if cvss.parse(vector) end end


And you can start parsing your CVSS vector now:

curl -d “vector=AV:L/AC:H/Au:N/C:C/I:C/A:C” http://api.armoredcode.com/api/v1/cvss ```

Enjoy it!

comments powered by Disqus