File: Corroborate.jsm

package info (click to toggle)
thunderbird 1%3A78.14.0-1~deb10u1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,922,628 kB
  • sloc: cpp: 5,990,120; javascript: 4,418,692; ansic: 3,063,889; python: 915,509; asm: 304,197; xml: 206,623; sh: 109,253; java: 108,679; makefile: 22,985; perl: 15,867; yacc: 4,565; objc: 3,026; pascal: 1,787; lex: 1,720; ada: 1,681; cs: 879; exp: 505; awk: 485; sql: 452; php: 436; lisp: 432; ruby: 99; sed: 69; csh: 45
file content (86 lines) | stat: -rw-r--r-- 2,870 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

const { AppConstants } = ChromeUtils.import(
  "resource://gre/modules/AppConstants.jsm"
);
const { FileUtils } = ChromeUtils.import(
  "resource://gre/modules/FileUtils.jsm"
);
const { OS } = ChromeUtils.import("resource://gre/modules/osfile.jsm");
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
const { XPCOMUtils } = ChromeUtils.import(
  "resource://gre/modules/XPCOMUtils.jsm"
);

XPCOMUtils.defineLazyServiceGetters(this, {
  gCertDB: ["@mozilla.org/security/x509certdb;1", "nsIX509CertDB"],
});

var EXPORTED_SYMBOLS = ["Corroborate"];

/**
 * Tools for verifying internal files in Mozilla products.
 */
this.Corroborate = {
  async init() {
    const appOmniJar = FileUtils.getFile("XCurProcD", [
      AppConstants.OMNIJAR_NAME,
    ]);
    const greOmniJar = FileUtils.getFile("GreD", [AppConstants.OMNIJAR_NAME]);

    let corruptOmnijar = true;
    // If an omni jar is missing, we consider that corrupt. Firefox could be running with
    // an omni jar unpacked, but it would never be signed correctly in that case so there
    // isn't a point checking further.
    if (
      (await OS.File.exists(appOmniJar.path)) &&
      (await OS.File.exists(greOmniJar.path))
    ) {
      corruptOmnijar = !(
        (await this.verifyJar(appOmniJar)) && (await this.verifyJar(greOmniJar))
      );
    }

    Services.telemetry.scalarSet(
      "corroborate.omnijar_corrupted",
      corruptOmnijar
    );

    // Check whether libxul's build ID matches the one in the GRE omni jar.
    // As above, Firefox could be running with an omni jar unpacked, in which
    // case we're really just checking that the version in the unpacked
    // AppConstants.jsm matches libxul.
    let mismatchedOmnijar =
      Services.appinfo.platformBuildID != AppConstants.MOZ_BUILDID;

    Services.telemetry.scalarSet(
      "corroborate.omnijar_mismatch",
      mismatchedOmnijar
    );
  },

  /**
   * Verify signed state of arbitrary JAR file. Currently only JAR files signed
   * with Mozilla-internal keys are supported.
   *
   * @argument file - an nsIFile pointing to the JAR to verify.
   *
   * @returns {Promise} - resolves true if file exists and is valid, false otherwise.
   *                      Never rejects.
   */
  verifyJar(file) {
    let root = Ci.nsIX509CertDB.AddonsPublicRoot;
    let expectedOrganizationalUnit = "Mozilla Components";

    return new Promise(resolve => {
      gCertDB.openSignedAppFileAsync(root, file, (rv, _zipReader, cert) => {
        resolve(
          Components.isSuccessCode(rv) &&
            cert.organizationalUnit === expectedOrganizationalUnit
        );
      });
    });
  },
};