// FetchUpdate fetches vulnerability updates from the Debian Security Tracker. func (fetcher *DebianFetcher) FetchUpdate() (resp updater.FetcherResponse, err error) { log.Info("fetching Debian vulneratibilities") // Download JSON. r, err := http.Get(url) if err != nil { log.Errorf("could not download Debian's update: %s", err) return resp, cerrors.ErrCouldNotDownload } // Get the SHA-1 of the latest update's JSON data latestHash, err := database.GetFlagValue(debianUpdaterFlag) if err != nil { return resp, err } // Parse the JSON. resp, err = buildResponse(r.Body, latestHash) if err != nil { return resp, err } return resp, nil }
// FetchUpdate gets vulnerability updates from the Red Hat OVAL definitions. func (f *RHELFetcher) FetchUpdate() (resp updater.FetcherResponse, err error) { log.Info("fetching Red Hat vulneratibilities") // Get the first RHSA we have to manage. flagValue, err := database.GetFlagValue(rhelUpdaterFlag) if err != nil { return resp, err } firstRHSA, err := strconv.Atoi(flagValue) if firstRHSA == 0 || err != nil { firstRHSA = firstRHEL5RHSA } // Fetch the update list. r, err := http.Get(ovalURI) if err != nil { log.Errorf("could not download RHEL's update list: %s", err) return resp, cerrors.ErrCouldNotDownload } // Get the list of RHSAs that we have to process. var rhsaList []int scanner := bufio.NewScanner(r.Body) for scanner.Scan() { line := scanner.Text() r := rhsaRegexp.FindStringSubmatch(line) if len(r) == 2 { rhsaNo, _ := strconv.Atoi(r[1]) if rhsaNo > firstRHSA { rhsaList = append(rhsaList, rhsaNo) } } } for _, rhsa := range rhsaList { // Download the RHSA's XML file. r, err := http.Get(ovalURI + rhsaFilePrefix + strconv.Itoa(rhsa) + ".xml") if err != nil { log.Errorf("could not download RHEL's update file: %s", err) return resp, cerrors.ErrCouldNotDownload } // Parse the XML. vs, err := parseRHSA(r.Body) if err != nil { return resp, err } // Collect vulnerabilities. for _, v := range vs { if len(v.FixedIn) > 0 { resp.Vulnerabilities = append(resp.Vulnerabilities, v) } } } // Set the flag if we found anything. if len(rhsaList) > 0 { resp.FlagName = rhelUpdaterFlag resp.FlagValue = strconv.Itoa(rhsaList[len(rhsaList)-1]) } else { log.Debug("no Red Hat update.") } return resp, nil }
// FetchUpdate gets vulnerability updates from the Ubuntu CVE Tracker. func (fetcher *UbuntuFetcher) FetchUpdate() (resp updater.FetcherResponse, err error) { log.Info("fetching Ubuntu vulneratibilities") // Check to see if the repository does not already exist. var revisionNumber int if _, pathExists := os.Stat(repositoryLocalPath); repositoryLocalPath == "" || os.IsNotExist(pathExists) { // Create a temporary folder and download the repository. p, err := ioutil.TempDir(os.TempDir(), "ubuntu-cve-tracker") if err != nil { return resp, ErrFilesystem } // bzr wants an empty target directory. repositoryLocalPath = p + "/repository" // Create the new repository. revisionNumber, err = createRepository(repositoryLocalPath) if err != nil { return resp, err } } else { // Update the repository that's already on disk. revisionNumber, err = updateRepository(repositoryLocalPath) if err != nil { return resp, err } } // Get the latest revision number we successfully applied in the database. dbRevisionNumber, err := database.GetFlagValue("ubuntuUpdater") if err != nil { return resp, err } // Get the list of vulnerabilities that we have to update. modifiedCVE, err := collectModifiedVulnerabilities(revisionNumber, dbRevisionNumber, repositoryLocalPath) if err != nil { return resp, err } // Parse and add the vulnerabilities. for cvePath := range modifiedCVE { file, err := os.Open(repositoryLocalPath + "/" + cvePath) if err != nil { // This can happen when a file is modified and then moved in another // commit. continue } defer file.Close() v, unknownReleases, err := parseUbuntuCVE(file) if err != nil { return resp, err } if len(v.FixedIn) > 0 { resp.Vulnerabilities = append(resp.Vulnerabilities, v) } // Log any unknown releases. for k := range unknownReleases { note := fmt.Sprintf("Ubuntu %s is not mapped to any version number (eg. trusty->14.04). Please update me.", k) resp.Notes = append(resp.Notes, note) log.Warning(note) // If we encountered unknown Ubuntu release, we don't want the revision // number to be considered as managed. dbRevisionNumberInt, _ := strconv.Atoi(dbRevisionNumber) revisionNumber = dbRevisionNumberInt } } // Add flag information resp.FlagName = ubuntuUpdaterFlag resp.FlagValue = strconv.Itoa(revisionNumber) return }