Add ICU message format support
[chromium-blink-merge.git] / chrome / common / safe_browsing / csd.proto
blob5243dc9bf1a306670462f08eb89d6b38f423cac4
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 //
5 // Client side phishing and malware detection request and response
6 // protocol buffers.  Those protocol messages should be kept in sync
7 // with the server implementation.
8 //
9 // If you want to change this protocol definition or you have questions
10 // regarding its format please contact chrome-anti-phishing@googlegroups.com.
12 syntax = "proto2";
14 option optimize_for = LITE_RUNTIME;
16 package safe_browsing;
18 // Protocol buffer describing the Chrome user population of the user reporting
19 // data.
20 message ChromeUserPopulation {
21   enum UserPopulation {
22     UNKNOWN_USER_POPULATION = 0;
23     SAFE_BROWSING = 1;
24     EXTENDED_REPORTING = 2;
25   }
26   optional UserPopulation user_population = 1;
30 message ClientPhishingRequest {
31   // URL that the client visited.  The CGI parameters are stripped by the
32   // client.
33   optional string url = 1;
35   // A 5-byte SHA-256 hash prefix of the URL.  Before hashing the URL is
36   // canonicalized, converted to a suffix-prefix expression and broadened
37   // (www prefix is removed and everything past the last '/' is stripped).
38   //
39   // Marked OBSOLETE because the URL is sent for all users, making the hash
40   // prefix unnecessary.
41   optional bytes OBSOLETE_hash_prefix = 10;
43   // Score that was computed on the client.  Value is between 0.0 and 1.0.
44   // The larger the value the more likely the url is phishing.
45   required float client_score = 2;
47   // Note: we're skipping tag 3 because it was previously used.
49   // Is true if the features for this URL were classified as phishing.
50   // Currently, this will always be true for all client-phishing requests
51   // that are sent to the server.
52   optional bool is_phishing = 4;
54   message Feature {
55     // Feature name.  E.g., 'PageHasForms'.
56     required string name = 1;
58     // Feature value is always in the range [0.0, 1.0].  Boolean features
59     // have value 1.0.
60     required double value = 2;
61   }
63   // List of features that were extracted.  Those are the features that were
64   // sent to the scorer and which resulted in client_score being computed.
65   repeated Feature feature_map = 5;
67   // The version number of the model that was used to compute the client-score.
68   // Copied from ClientSideModel.version().
69   optional int32 model_version = 6;
71   // Field 7 is only used on the server.
73   // List of features that are extracted in the client but are not used in the
74   // machine learning model.
75   repeated Feature non_model_feature_map = 8;
77   // The referrer URL.  This field might not be set, for example, in the case
78   // where the referrer uses HTTPs.
79   // OBSOLETE: Use feature 'Referrer=<referrer>' instead.
80   optional string OBSOLETE_referrer_url = 9;
82   // Field 11 is only used on the server.
84   // List of shingle hashes we extracted.
85   repeated uint32 shingle_hashes = 12 [packed = true];
87   // The model filename (basename) that was used by the client.
88   optional string model_filename = 13;
90   // Population that the reporting user is part of.
91   optional ChromeUserPopulation population = 14;
94 message ClientPhishingResponse {
95   required bool phishy = 1;
97   // A list of SafeBrowsing host-suffix / path-prefix expressions that
98   // are whitelisted.  The client must match the current top-level URL
99   // against these whitelisted expressions and only apply a positive
100   // phishing verdict above if the URL does not match any expression
101   // on this whitelist.  The client must not cache these whitelisted
102   // expressions.  This whitelist will be empty for the vast majority
103   // of the responses but might contain up to 100 entries in emergency
104   // situations.
105   //
106   // Marked OBSOLETE because the URL is sent for all users, so the server
107   // can do whitelist matching.
108   repeated string OBSOLETE_whitelist_expression = 2;
111 message ClientMalwareRequest {
112   // URL that the client visited.  The CGI parameters are stripped by the
113   // client.
114   required string url = 1;
116   // Field 2 is deleted and no longer in use.
118   // Field 3 is only used on the server.
120   // The referrer URL.  This field might not be set, for example, in the case
121   // where the referrer uses HTTPS.
122   optional string referrer_url = 4;
124   // Field 5 and 6 are only used on the server.
126   message UrlInfo {
127     required string ip = 1;
128     required string url = 2;
129     optional string method = 3;
130     optional string referrer = 4;
131     // Resource type, the int value is a direct cast from the Type enum
132     // of ResourceType class defined in //src/webkit/commom/resource_type.h
133     optional int32 resource_type = 5;
134   }
136   // List of resource urls that match the malware IP list.
137   repeated UrlInfo bad_ip_url_info = 7;
139   // Population that the reporting user is part of.
140   optional ChromeUserPopulation population = 9;
143 message ClientMalwareResponse {
144   required bool blacklist = 1;
145   // The confirmed blacklisted bad IP and its url, which will be shown in
146   // malware warning, if the blacklist verdict is true.
147   // This IP string could be either in IPv4 or IPv6 format, which is the same
148   // as the ones client sent to server.
149   optional string bad_ip = 2;
150   optional string bad_url = 3;
153 message ClientDownloadRequest {
154   // The final URL of the download (after all redirects).
155   required string url = 1;
157   // This message contains various binary digests of the download payload.
158   message Digests {
159     optional bytes sha256 = 1;
160     optional bytes sha1 = 2;
161     optional bytes md5 = 3;
162   }
163   required Digests digests = 2;
165   // This is the length in bytes of the download payload.
166   required int64 length = 3;
168   // Type of the resources stored below.
169   enum ResourceType {
170     // The final URL of the download payload.  The resource URL should
171     // correspond to the URL field above.
172     DOWNLOAD_URL = 0;
173     // A redirect URL that was fetched before hitting the final DOWNLOAD_URL.
174     DOWNLOAD_REDIRECT = 1;
175     // The final top-level URL of the tab that triggered the download.
176     TAB_URL = 2;
177     // A redirect URL thas was fetched before hitting the final TAB_URL.
178     TAB_REDIRECT = 3;
179   }
181   message Resource {
182     required string url = 1;
183     required ResourceType type = 2;
184     optional bytes remote_ip = 3;
185     // This will only be set if the referrer is available and if the
186     // resource type is either TAB_URL or DOWNLOAD_URL.
187     optional string referrer = 4;
189     // TODO(noelutz): add the transition type?
190   }
192   // This repeated field will store all the redirects as well as the
193   // final URLs for the top-level tab URL (i.e., the URL that
194   // triggered the download) as well as for the download URL itself.
195   repeated Resource resources = 4;
197   // A trust chain of certificates.  Each chain begins with the signing
198   // certificate of the binary, and ends with a self-signed certificate,
199   // typically from a trusted root CA.  This structure is analogous to
200   // CERT_CHAIN_CONTEXT on Windows.
201   message CertificateChain {
202     // A single link in the chain.
203     message Element {
204       // DER-encoded X.509 representation of the certificate.
205       optional bytes certificate = 1;
206       // Fields 2 - 7 are only used on the server.
207     }
208     repeated Element element = 1;
209   }
211   message SignatureInfo {
212     // All certificate chains for each of the binary's signers.  Multiple chains
213     // may be present if the binary or any certificate has multiple signers.
214     // Absence of certificate chains does not imply that the binary is not
215     // signed (in that case, SignedData blobs extracted from the binary may be
216     // preset), but does mean that trust has not been verified.
217     repeated CertificateChain certificate_chain = 1;
219     // True if the signature was trusted on the client.
220     optional bool trusted = 2;
222     // PKCS#7 SignedData blobs extracted from a portable executable image's
223     // attribute certificate table. The presence of these does not imply that
224     // the signatures were deemed trusted by the client.
225     repeated bytes signed_data = 3;
226   }
228   // This field will only be set if the binary is signed.
229   optional SignatureInfo signature = 5;
231   // True if the download was user initiated.
232   optional bool user_initiated = 6;
234   // Fields 7 and 8 are only used on the server.
236   // Name of the file where the download would be stored if the
237   // download completes.  E.g., "bla.exe".
238   optional string file_basename = 9;
240   // Starting with Chrome M19 we're also sending back pings for Chrome
241   // extensions that get downloaded by users.
242   enum DownloadType {
243     WIN_EXECUTABLE = 0;    // Currently all .exe, .cab and .msi files.
244     CHROME_EXTENSION = 1;  // .crx files.
245     ANDROID_APK = 2;       // .apk files.
246     // .zip files containing one of the other executable types.
247     ZIPPED_EXECUTABLE = 3;
248     MAC_EXECUTABLE = 4;  // .dmg, .pkg, etc.
249     ZIPPED_ARCHIVE = 5;  // .zip file containing another archive.
250   }
251   optional DownloadType download_type = 10 [default = WIN_EXECUTABLE];
253   // Locale of the device, eg en, en_US.
254   optional string locale = 11;
256   message PEImageHeaders {
257     // IMAGE_DOS_HEADER.
258     optional bytes dos_header = 1;
259     // IMAGE_FILE_HEADER.
260     optional bytes file_header = 2;
261     // IMAGE_OPTIONAL_HEADER32. Present only for 32-bit PE images.
262     optional bytes optional_headers32 = 3;
263     // IMAGE_OPTIONAL_HEADER64. Present only for 64-bit PE images.
264     optional bytes optional_headers64 = 4;
265     // IMAGE_SECTION_HEADER.
266     repeated bytes section_header = 5;
267     // Contents of the .edata section.
268     optional bytes export_section_data = 6;
270     message DebugData {
271       // IMAGE_DEBUG_DIRECTORY.
272       optional bytes directory_entry = 1;
273       optional bytes raw_data = 2;
274     }
276     repeated DebugData debug_data = 7;
277   }
279   message MachOHeaders {
280     // The mach_header or mach_header_64 struct.
281     required bytes mach_header = 1;
283     message LoadCommand {
284       // |command_id| is the first uint32 of |command| as well, but is
285       // extracted for easier processing.
286       required uint32 command_id = 1;
287       // The entire data stream of the load command.
288       required bytes command = 2;
289     }
291     // All the load commands of the Mach-O file.
292     repeated LoadCommand load_commands = 2;
293   }
295   message ImageHeaders {
296     // Windows Portable Executable image headers.
297     optional PEImageHeaders pe_headers = 1;
299     // OS X Mach-O image headers.
300     optional MachOHeaders mach_o_headers = 2;
301   };
303   // Fields 12-17 are reserved for server-side use and are never sent by the
304   // client.
306   optional ImageHeaders image_headers = 18;
308   // Fields 19-21 are reserved for server-side use and are never sent by the
309   // client.
311   // A binary contained in an archive (e.g., a .zip archive).
312   message ArchivedBinary {
313     optional string file_basename = 1;
314     optional DownloadType download_type = 2;
315     optional Digests digests = 3;
316     optional int64 length = 4;
317     optional SignatureInfo signature = 5;
318     optional ImageHeaders image_headers = 6;
319   }
321   repeated ArchivedBinary archived_binary = 22;
323   // Population that the reporting user is part of.
324   optional ChromeUserPopulation population = 24;
327 message ClientDownloadResponse {
328   enum Verdict {
329     // Download is considered safe.
330     SAFE = 0;
331     // Download is considered dangerous.  Chrome should show a warning to the
332     // user.
333     DANGEROUS = 1;
334     // Download is unknown.  Chrome should display a less severe warning.
335     UNCOMMON = 2;
336     // The download is potentially unwanted.
337     POTENTIALLY_UNWANTED = 3;
338     // The download is from a dangerous host.
339     DANGEROUS_HOST = 4;
340   }
341   required Verdict verdict = 1;
343   message MoreInfo {
344     // A human-readable string describing the nature of the warning.
345     // Only if verdict != SAFE. Localized based on request.locale.
346     optional string description = 1;
348     // A URL to get more information about this warning, if available.
349     optional string url = 2;
350   }
351   optional MoreInfo more_info = 2;
353   // An arbitrary token that should be sent along for further server requests.
354   optional bytes token = 3;
357 // The following protocol buffer holds the feedback report gathered
358 // from the user regarding the download.
359 message ClientDownloadReport {
360   // The information of user who provided the feedback.
361   // This is going to be useful for handling appeals.
362   message UserInformation {
363     optional string email = 1;
364   }
366   enum Reason {
367     SHARE = 0;
368     FALSE_POSITIVE = 1;
369     APPEAL = 2;
370   }
372   // The type of feedback for this report.
373   optional Reason reason = 1;
375   // The original download ping
376   optional ClientDownloadRequest download_request = 2;
378   // Stores the information of the user who provided the feedback.
379   optional UserInformation user_information = 3;
381   // Unstructed comments provided by the user.
382   optional bytes comment = 4;
384   // The original download response sent from the verdict server.
385   optional ClientDownloadResponse download_response = 5;
388 // This is used to send back upload status to the client after upload completion
389 message ClientUploadResponse {
390   enum UploadStatus {
391     // The upload was successful and a complete response can be expected
392     SUCCESS = 0;
394     // The upload was unsuccessful and the response is incomplete.
395     UPLOAD_FAILURE = 1;
396   }
398   // Holds the upload status
399   optional UploadStatus status = 1;
401   // Holds the permalink where the results of scanning the binary are available
402   optional string permalink = 2;
405 message ClientIncidentReport {
406   message IncidentData {
407     message TrackedPreferenceIncident {
408       enum ValueState {
409         UNKNOWN = 0;
410         CLEARED = 1;
411         WEAK_LEGACY_OBSOLETE = 2;
412         CHANGED = 3;
413         UNTRUSTED_UNKNOWN_VALUE = 4;
414       }
416       optional string path = 1;
417       optional string atomic_value = 2;
418       repeated string split_key = 3;
419       optional ValueState value_state = 4;
420     }
421     message BinaryIntegrityIncident {
422       optional string file_basename = 1;
423       optional ClientDownloadRequest.SignatureInfo signature = 2;
424     }
425     message BlacklistLoadIncident {
426       optional string path = 1;
427       optional ClientDownloadRequest.Digests digest = 2;
428       optional string version = 3;
429       optional bool blacklist_initialized = 4;
430       optional ClientDownloadRequest.SignatureInfo signature = 5;
431       optional ClientDownloadRequest.ImageHeaders image_headers = 6;
432     }
433     message VariationsSeedSignatureIncident {
434       optional string variations_seed_signature = 1;
435     }
436     message ResourceRequestIncident {
437       enum Type {
438         UNKNOWN = 0;
439         TYPE_SCRIPT = 1;
440         TYPE_DOMAIN = 2;
441       }
442       optional bytes digest = 1;
443       optional string origin = 2;
444       optional Type type = 3 [default = UNKNOWN];
445     }
446     optional int64 incident_time_msec = 1;
447     optional TrackedPreferenceIncident tracked_preference = 2;
448     optional BinaryIntegrityIncident binary_integrity = 3;
449     optional BlacklistLoadIncident blacklist_load = 4;
450     // Note: skip tag 5 because it was previously used.
451     optional VariationsSeedSignatureIncident variations_seed_signature = 6;
452     optional ResourceRequestIncident resource_request = 7;
453   }
455   repeated IncidentData incident = 1;
457   message DownloadDetails {
458     optional bytes token = 1;
459     optional ClientDownloadRequest download = 2;
460     optional int64 download_time_msec = 3;
461     optional int64 open_time_msec = 4;
462   }
464   optional DownloadDetails download = 2;
466   message EnvironmentData {
467     message OS {
468       optional string os_name = 1;
469       optional string os_version = 2;
470     }
471     optional OS os = 1;
472     message Machine {
473       optional string cpu_architecture = 1;
474       optional string cpu_vendor = 2;
475       optional uint32 cpuid = 3;
476     }
477     optional Machine machine = 2;
478     message Process {
479       optional string version = 1;
480       repeated string OBSOLETE_dlls = 2;
481       message Patch {
482         optional string function = 1;
483         optional string target_dll = 2;
484       }
485       repeated Patch patches = 3;
486       message NetworkProvider {}
487       repeated NetworkProvider network_providers = 4;
488       enum Channel {
489         CHANNEL_UNKNOWN = 0;
490         CHANNEL_CANARY = 1;
491         CHANNEL_DEV = 2;
492         CHANNEL_BETA = 3;
493         CHANNEL_STABLE = 4;
494       }
495       optional Channel chrome_update_channel = 5;
496       optional int64 uptime_msec = 6;
497       optional bool metrics_consent = 7;
498       optional bool extended_consent = 8;
499       message Dll {
500         enum Feature {
501           UNKNOWN = 0;
502           LSP = 1;
503         }
504         optional string path = 1;
505         optional uint64 base_address = 2;
506         optional uint32 length = 3;
507         repeated Feature feature = 4;
508         optional ClientDownloadRequest.ImageHeaders image_headers = 5;
509       }
510       repeated Dll dll = 9;
511       repeated string blacklisted_dll = 10;
512       message ModuleState {
513         enum ModifiedState {
514           UNKNOWN = 0;
515           MODULE_STATE_UNKNOWN = 1;
516           MODULE_STATE_UNMODIFIED = 2;
517           MODULE_STATE_MODIFIED = 3;
518         }
519         optional string name = 1;
520         optional ModifiedState modified_state = 2;
521         repeated string OBSOLETE_modified_export = 3;
523         message Modification {
524           optional uint32 file_offset = 1;
525           optional int32 byte_count = 2;
526           optional bytes modified_bytes = 3;
527           optional string export_name = 4;
528         }
529         repeated Modification modification = 4;
530       }
531       repeated ModuleState module_state = 11;
532     }
533     optional Process process = 3;
534   }
536   optional EnvironmentData environment = 3;
538   // Population that the reporting user is part of.
539   optional ChromeUserPopulation population = 7;
542 message ClientIncidentResponse {
543   optional bytes token = 1;
544   optional bool download_requested = 2;
546   message EnvironmentRequest { optional int32 dll_index = 1; }
548   repeated EnvironmentRequest environment_requests = 3;
551 message DownloadMetadata {
552   optional uint32 download_id = 1;
554   optional ClientIncidentReport.DownloadDetails download = 2;