1 // Copyright 2015 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 #ifndef CONTENT_BROWSER_BAD_MESSAGE_H_
6 #define CONTENT_BROWSER_BAD_MESSAGE_H_
7 
8 #include "base/debug/crash_logging.h"
9 #include "content/common/content_export.h"
10 
11 namespace content {
12 class BrowserMessageFilter;
13 class RenderProcessHost;
14 
15 namespace bad_message {
16 
17 // The browser process often chooses to terminate a renderer if it receives
18 // a bad IPC message. The reasons are tracked for metrics.
19 //
20 // Content embedders should implement their own bad message statistics but
21 // should use similar histogram names to make analysis easier.
22 //
23 // NOTE: Do not remove or reorder elements in this list. Add new entries at the
24 // end. Items may be renamed but do not change the values. We rely on the enum
25 // values in histograms.
26 enum BadMessageReason {
27   NC_IN_PAGE_NAVIGATION = 0,
28   RFH_CAN_COMMIT_URL_BLOCKED = 1,
29   RFH_CAN_ACCESS_FILES_OF_PAGE_STATE = 2,
30   RFH_SANDBOX_FLAGS = 3,
31   RFH_NO_PROXY_TO_PARENT = 4,
32   RPH_DESERIALIZATION_FAILED = 5,
33   OBSOLETE_RVH_CAN_ACCESS_FILES_OF_PAGE_STATE = 6,
34   OBSOLETE_RFH_FILE_CHOOSER_PATH = 7,
35   OBSOLETE_RWH_SYNTHETIC_GESTURE = 8,
36   OBSOLETE_RWH_FOCUS = 9,
37   OBSOLETE_RWH_BLUR = 10,
38   RWH_SHARED_BITMAP = 11,
39   OBSOLETE_RWH_BAD_ACK_MESSAGE = 12,
40   OBSOLETE_RWHVA_SHARED_MEMORY = 13,
41   SERVICE_WORKER_BAD_URL = 14,
42   OBSOLETE_WC_INVALID_FRAME_SOURCE = 15,
43   OBSOLETE_RWHVM_UNEXPECTED_FRAME_TYPE = 16,
44   RFPH_DETACH = 17,
45   DFH_BAD_EMBEDDER_MESSAGE = 18,
46   NC_AUTO_SUBFRAME = 19,
47   CSDH_NOT_RECOGNIZED = 20,
48   OBSOLETE_DSMF_OPEN_STORAGE = 21,
49   DSMF_LOAD_STORAGE = 22,
50   OBSOLETE_DBMF_INVALID_ORIGIN_ON_OPEN = 23,
51   OBSOLETE_DBMF_DB_NOT_OPEN_ON_MODIFY = 24,
52   OBSOLETE_DBMF_DB_NOT_OPEN_ON_CLOSE = 25,
53   OBSOLETE_DBMF_INVALID_ORIGIN_ON_SQLITE_ERROR = 26,
54   RDH_INVALID_PRIORITY = 27,
55   OBSOLETE_RDH_REQUEST_NOT_TRANSFERRING = 28,
56   RDH_BAD_DOWNLOAD = 29,
57   OBSOLETE_NMF_NO_PERMISSION_SHOW = 30,
58   OBSOLETE_NMF_NO_PERMISSION_CLOSE = 31,
59   OBSOLETE_NMF_NO_PERMISSION_VERIFY = 32,
60   MH_INVALID_MIDI_PORT = 33,
61   MH_SYS_EX_PERMISSION = 34,
62   ACDH_REGISTER = 35,
63   ACDH_UNREGISTER = 36,
64   ACDH_SET_SPAWNING = 37,
65   ACDH_SELECT_CACHE = 38,
66   OBSOLETE_ACDH_SELECT_CACHE_FOR_WORKER = 39,
67   ACDH_SELECT_CACHE_FOR_SHARED_WORKER = 40,
68   ACDH_MARK_AS_FOREIGN_ENTRY = 41,
69   ACDH_PENDING_REPLY_IN_GET_STATUS = 42,
70   ACDH_GET_STATUS = 43,
71   ACDH_PENDING_REPLY_IN_START_UPDATE = 44,
72   ACDH_START_UPDATE = 45,
73   ACDH_PENDING_REPLY_IN_SWAP_CACHE = 46,
74   ACDH_SWAP_CACHE = 47,
75   SWDH_NOT_HANDLED = 48,
76   OBSOLETE_SWDH_REGISTER_BAD_URL = 49,
77   OBSOLETE_SWDH_REGISTER_NO_HOST = 50,
78   OBSOLETE_SWDH_REGISTER_CANNOT = 51,
79   OBSOLETE_SWDH_UNREGISTER_BAD_URL = 52,
80   OBSOLETE_SWDH_UNREGISTER_NO_HOST = 53,
81   OBSOLETE_SWDH_UNREGISTER_CANNOT = 54,
82   OBSOLETE_SWDH_GET_REGISTRATION_BAD_URL = 55,
83   OBSOLETE_SWDH_GET_REGISTRATION_NO_HOST = 56,
84   OBSOLETE_SWDH_GET_REGISTRATION_CANNOT = 57,
85   OBSOLETE_SWDH_GET_REGISTRATION_FOR_READY_NO_HOST = 58,
86   OBSOLETE_SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS = 59,
87   SWDH_POST_MESSAGE = 60,
88   OBSOLETE_SWDH_PROVIDER_CREATED_NO_HOST = 61,
89   OBSOLETE_SWDH_PROVIDER_DESTROYED_NO_HOST = 62,
90   OBSOLETE_SWDH_SET_HOSTED_VERSION_NO_HOST = 63,
91   OBSOLETE_SWDH_SET_HOSTED_VERSION = 64,
92   OBSOLETE_SWDH_WORKER_SCRIPT_LOAD_NO_HOST = 65,
93   SWDH_INCREMENT_WORKER_BAD_HANDLE = 66,
94   SWDH_DECREMENT_WORKER_BAD_HANDLE = 67,
95   OBSOLETE_SWDH_INCREMENT_REGISTRATION_BAD_HANDLE = 68,
96   OBSOLETE_SWDH_DECREMENT_REGISTRATION_BAD_HANDLE = 69,
97   SWDH_TERMINATE_BAD_HANDLE = 70,
98   OBSOLETE_FAMF_APPEND_ITEM_TO_BLOB = 71,
99   OBSOLETE_FAMF_APPEND_SHARED_MEMORY_TO_BLOB = 72,
100   OBSOLETE_FAMF_MALFORMED_STREAM_URL = 73,
101   OBSOLETE_FAMF_APPEND_ITEM_TO_STREAM = 74,
102   OBSOLETE_FAMF_APPEND_SHARED_MEMORY_TO_STREAM = 75,
103   OBSOLETE_IDBDH_CAN_READ_FILE = 76,
104   OBSOLETE_IDBDH_GET_OR_TERMINATE = 77,
105   RFMF_SET_COOKIE_BAD_ORIGIN = 78,
106   RFMF_GET_COOKIES_BAD_ORIGIN = 79,
107   OBSOLETE_SWDH_GET_REGISTRATIONS_NO_HOST = 80,
108   OBSOLETE_SWDH_GET_REGISTRATIONS_INVALID_ORIGIN = 81,
109   OBSOLETE_AOAH_UNAUTHORIZED_URL = 82,
110   BDH_INVALID_SERVICE_ID = 83,
111   OBSOLETE_RFH_COMMIT_DESERIALIZATION_FAILED = 84,
112   BDH_INVALID_CHARACTERISTIC_ID = 85,
113   OBSOLETE_SWDH_UPDATE_NO_HOST = 86,
114   OBSOLETE_SWDH_UPDATE_BAD_REGISTRATION_ID = 87,
115   OBSOLETE_SWDH_UPDATE_CANNOT = 88,
116   OBSOLETE_SWDH_UNREGISTER_BAD_REGISTRATION_ID = 89,
117   BDH_INVALID_WRITE_VALUE_LENGTH = 90,
118   OBSOLETE_WC_MEMORY_CACHE_RESOURCE_BAD_SECURITY_INFO = 91,
119   OBSOLETE_WC_RENDERER_DID_NAVIGATE_BAD_SECURITY_INFO = 92,
120   OBSOLETE_BDH_DUPLICATE_REQUEST_DEVICE_ID = 93,
121   CSDH_INVALID_ORIGIN = 94,
122   OBSOLETE_RDH_ILLEGAL_ORIGIN = 95,
123   OBSOLETE_RDH_UNAUTHORIZED_HEADER_REQUEST = 96,
124   RDH_INVALID_URL = 97,
125   OBSOLETE_BDH_CHARACTERISTIC_ALREADY_SUBSCRIBED = 98,
126   RFH_OWNER_PROPERTY = 99,
127   OBSOLETE_BDH_EMPTY_OR_INVALID_FILTERS = 100,
128   OBSOLETE_WC_CONTENT_WITH_CERT_ERRORS_BAD_SECURITY_INFO = 101,
129   OBSOLETE_RFMF_RENDERER_FAKED_ITS_OWN_DEATH = 102,
130   DWNLD_INVALID_SAVABLE_RESOURCE_LINKS_RESPONSE = 103,
131   OBSOLETE_DWNLD_INVALID_SERIALIZE_AS_MHTML_RESPONSE = 104,
132   BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN = 105,
133   OBSOLETE_ACI_WRONG_STORAGE_PARTITION = 106,
134   OBSOLETE_RDHI_WRONG_STORAGE_PARTITION = 107,
135   RDH_INVALID_REQUEST_ID = 108,
136   BDH_SERVICE_NOT_ALLOWED_FOR_ORIGIN = 109,
137   WSI_UNEXPECTED_ADD_CHANNEL_REQUEST = 110,
138   WSI_UNEXPECTED_SEND_FRAME = 111,
139   RFH_UNEXPECTED_LOAD_START = 112,
140   NMF_INVALID_ARGUMENT = 113,
141   RFH_INVALID_ORIGIN_ON_COMMIT = 114,
142   BDH_UUID_REGISTERED = 115,
143   BDH_CONSTRUCTION_FAILED = 116,
144   BDH_INVALID_REFCOUNT_OPERATION = 117,
145   BDH_INVALID_URL_OPERATION = 118,
146   OBSOLETE_IDBDH_INVALID_ORIGIN = 119,
147   OBSOLETE_RFH_FAIL_PROVISIONAL_LOAD_NO_HANDLE = 120,
148   OBSOLETE_RFH_FAIL_PROVISIONAL_LOAD_NO_ERROR = 121,
149   NI_IN_PAGE_NAVIGATION = 122,
150   RPH_MOJO_PROCESS_ERROR = 123,
151   OBSOLETE_DBMF_INVALID_ORIGIN_ON_GET_SPACE = 124,
152   OBSOLETE_DBMF_INVALID_ORIGIN_ON_MODIFIED = 125,
153   OBSOLETE_DBMF_INVALID_ORIGIN_ON_CLOSED = 126,
154   OBSOLETE_WSI_INVALID_HEADER_VALUE = 127,
155   OBSOLETE_SWDH_SET_HOSTED_VERSION_INVALID_HOST = 128,
156   OBSOLETE_SWDH_SET_HOSTED_VERSION_PROCESS_MISMATCH = 129,
157   OBSOLETE_MSDH_INVALID_FRAME_ID = 130,
158   SDH_INVALID_PORT_RANGE = 131,
159   SCO_INVALID_ARGUMENT = 132,
160   RFH_INCONSISTENT_DEVTOOLS_MESSAGE = 133,
161   DSH_DUPLICATE_CONNECTION_ID = 134,
162   DSH_NOT_CREATED_SESSION_ID = 135,
163   DSH_NOT_ALLOCATED_SESSION_ID = 136,
164   DSH_DELETED_SESSION_ID = 137,
165   OBSOLETE_DSH_WRONG_STORAGE_PARTITION = 138,
166   BDH_DISALLOWED_ORIGIN = 139,
167   ARH_CREATED_STREAM_WITHOUT_AUTHORIZATION = 140,
168   MDDH_INVALID_DEVICE_TYPE_REQUEST = 141,
169   OBSOLETE_MDDH_UNAUTHORIZED_ORIGIN = 142,
170   OBSOLETE_SWDH_ENABLE_NAVIGATION_PRELOAD_NO_HOST = 143,
171   OBSOLETE_SWDH_ENABLE_NAVIGATION_PRELOAD_INVALID_ORIGIN = 144,
172   OBSOLETE_SWDH_ENABLE_NAVIGATION_PRELOAD_BAD_REGISTRATION_ID = 145,
173   OBSOLETE_RDH_TRANSFERRING_REQUEST_NOT_FOUND =
174       146,  // Disabled - crbug.com/659613.
175   OBSOLETE_RDH_TRANSFERRING_NONNAVIGATIONAL_REQUEST = 147,
176   OBSOLETE_SWDH_GET_NAVIGATION_PRELOAD_STATE_NO_HOST = 148,
177   OBSOLETE_SWDH_GET_NAVIGATION_PRELOAD_STATE_INVALID_ORIGIN = 149,
178   OBSOLETE_SWDH_GET_NAVIGATION_PRELOAD_STATE_BAD_REGISTRATION_ID = 150,
179   OBSOLETE_SWDH_SET_NAVIGATION_PRELOAD_HEADER_NO_HOST = 151,
180   OBSOLETE_SWDH_SET_NAVIGATION_PRELOAD_HEADER_INVALID_ORIGIN = 152,
181   OBSOLETE_SWDH_SET_NAVIGATION_PRELOAD_HEADER_BAD_REGISTRATION_ID = 153,
182   OBSOLETE_SWDH_SET_NAVIGATION_PRELOAD_HEADER_BAD_VALUE = 154,
183   MDDH_INVALID_SUBSCRIPTION_REQUEST = 155,
184   OBSOLETE_MDDH_INVALID_UNSUBSCRIPTION_REQUEST = 156,
185   OBSOLETE_AOAH_NONSENSE_DEVICE_ID = 157,
186   BDH_INVALID_OPTIONS = 158,
187   RFH_DID_ADD_CONSOLE_MESSAGE_BAD_SEVERITY = 159,
188   AIRH_VOLUME_OUT_OF_RANGE = 160,
189   BDH_INVALID_DESCRIPTOR_ID = 161,
190   OBSOLETE_RWH_INVALID_BEGIN_FRAME_ACK_DID_NOT_SWAP = 162,
191   OBSOLETE_RWH_INVALID_BEGIN_FRAME_ACK_COMPOSITOR_FRAME = 163,
192   BFSI_INVALID_DEVELOPER_ID = 164,
193   BFSI_INVALID_REQUESTS = 165,
194   BFSI_INVALID_TITLE = 166,
195   RWH_INVALID_FRAME_TOKEN = 167,
196   RWH_BAD_FRAME_SINK_REQUEST = 168,
197   RWH_SURFACE_INVARIANTS_VIOLATION = 169,
198   ILLEGAL_UPLOAD_PARAMS = 170,
199   RFH_BASE_URL_FOR_DATA_URL_SPECIFIED = 171,
200   OBSOLETE_RFPH_ILLEGAL_UPLOAD_PARAMS = 172,
201   OBSOLETE_SWDH_PROVIDER_CREATED_ILLEGAL_TYPE = 173,
202   OBSOLETE_SWDH_PROVIDER_CREATED_ILLEGAL_TYPE_NOT_WINDOW = 174,
203   OBSOLETE_SWDH_PROVIDER_CREATED_ILLEGAL_TYPE_SERVICE_WORKER = 175,
204   OBSOLETE_SWDH_PROVIDER_CREATED_DUPLICATE_ID = 176,
205   OBSOLETE_SWDH_PROVIDER_CREATED_BAD_ID = 177,
206   RFH_KEEP_ALIVE_HANDLE_REQUESTED_INCORRECTLY = 178,
207   BFSI_INVALID_UNIQUE_ID = 179,
208   BPE_UNEXPECTED_MESSAGE_BEFORE_BPGM_CREATION = 180,
209   WEBUI_SEND_FROM_UNAUTHORIZED_PROCESS = 181,
210   CPFC_RESIZE_PARAMS_CHANGED_LOCAL_SURFACE_ID_UNCHANGED = 182,
211   BPG_RESIZE_PARAMS_CHANGED_LOCAL_SURFACE_ID_UNCHANGED = 183,
212   RFH_NEGATIVE_SELECTION_START_OFFSET = 184,
213   WEBUI_BAD_SCHEME_ACCESS = 185,
214   CSDH_UNEXPECTED_OPERATION = 186,
215   RMF_BAD_URL_CACHEABLE_METADATA = 187,
216   RFH_INTERFACE_PROVIDER_MISSING = 188,
217   OBSOLETE_RFH_INTERFACE_PROVIDER_SUPERFLUOUS = 189,
218   AIRH_UNEXPECTED_BITSTREAM = 190,
219   ARH_UNEXPECTED_BITSTREAM = 191,
220   RDH_NULL_CLIENT = 192,
221   RVH_WEB_UI_BINDINGS_MISMATCH = 193,
222   WCI_NEW_WIDGET_PROCESS_MISMATCH = 194,
223   AUTH_INVALID_EFFECTIVE_DOMAIN = 195,
224   AUTH_INVALID_RELYING_PARTY = 196,
225   RWH_COPY_REQUEST_ATTEMPT = 197,
226   SYNC_COMPOSITOR_NO_FUTURE_FRAME = 198,
227   SYNC_COMPOSITOR_NO_BEGIN_FRAME = 199,
228   WEBUI_BAD_HOST_ACCESS = 200,
229   OBSOLETE_RFMF_BLOB_URL_TOKEN_FOR_NON_BLOB_URL = 201,
230   PERMISSION_SERVICE_BAD_PERMISSION_DESCRIPTOR = 202,
231   BLOB_URL_TOKEN_FOR_NON_BLOB_URL = 203,
232   OBSOLETE_RFPH_BLOB_URL_TOKEN_FOR_NON_BLOB_URL = 204,
233   RFH_ERROR_PROCESS_NON_ERROR_COMMIT = 205,
234   RFH_ERROR_PROCESS_NON_UNIQUE_ORIGIN_COMMIT = 206,
235   RFH_CANNOT_RENDER_FALLBACK_CONTENT = 207,
236   RFH_CHILD_FRAME_NEEDS_OWNER_ELEMENT_TYPE = 208,
237   OBSOLETE_RFH_INVALID_WEB_REPORTING_CRASH_ID = 209,
238   RFH_DETACH_MAIN_FRAME = 210,
239   RFH_BROWSER_INTERFACE_BROKER_MISSING = 211,
240   RFPH_POST_MESSAGE_INVALID_SOURCE_ORIGIN = 212,
241   INVALID_INITIATOR_ORIGIN = 213,
242   RFHI_BEGIN_NAVIGATION_MISSING_INITIATOR_ORIGIN = 214,
243   RFHI_BEGIN_NAVIGATION_NON_WEBBY_TRANSITION = 215,
244   RFH_NO_MATCHING_NAVIGATION_REQUEST_ON_COMMIT = 216,
245   AUTH_INVALID_ICON_URL = 217,
246   MDDH_INVALID_STREAM_SELECTION_INFO = 218,
247   REGISTER_PROTOCOL_HANDLER_INVALID_URL = 219,
248   NC_SAME_DOCUMENT_POST_COMMIT_ERROR = 220,
249   RFH_INVALID_WEB_UI_CONTROLLER = 221,
250   RFPH_ADVANCE_FOCUS_INTO_PORTAL = 222,
251   RFH_UNEXPECTED_EMBEDDING_TOKEN = 223,
252   RFH_MISSING_EMBEDDING_TOKEN = 224,
253   RFH_BAD_DOCUMENT_POLICY_HEADER = 225,
254   RFMF_INVALID_PLUGIN_EMBEDDER_ORIGIN = 226,
255   RFH_INVALID_CALL_FROM_NOT_MAIN_FRAME = 227,
256   INPUT_ROUTER_INVALID_EVENT_SOURCE = 228,
257   RFH_INACTIVE_CHECK_FROM_SPECULATIVE_RFH = 229,
258   RFH_SUBFRAME_CAPTURE_ON_MAIN_FRAME = 230,
259   RFH_CSP_ATTRIBUTE = 231,
260   RFH_RECEIVED_ASSOCIATED_MESSAGE_WHILE_BFCACHED = 232,
261   RWH_CLOSE_PORTAL = 233,
262   MSDH_INVALID_STREAM_TYPE = 234,
263   RFH_CREATE_CHILD_FRAME_TOKENS_NOT_FOUND = 235,
264 
265   // Please add new elements here. The naming convention is abbreviated class
266   // name (e.g. RenderFrameHost becomes RFH) plus a unique description of the
267   // reason. After making changes, you MUST update histograms.xml by running:
268   // "python tools/metrics/histograms/update_bad_message_reasons.py"
269   BAD_MESSAGE_MAX
270 };
271 
272 // Called when the browser receives a bad IPC message from a renderer process on
273 // the UI thread. Logs the event, records a histogram metric for the |reason|,
274 // and terminates the process for |host|.
275 void ReceivedBadMessage(RenderProcessHost* host, BadMessageReason reason);
276 
277 // Equivalent to the above, but callable from any thread.
278 CONTENT_EXPORT void ReceivedBadMessage(int render_process_id,
279                                        BadMessageReason reason);
280 
281 // Called when a browser message filter receives a bad IPC message from a
282 // renderer or other child process. Logs the event, records a histogram metric
283 // for the |reason|, and terminates the process for |filter|.
284 void ReceivedBadMessage(BrowserMessageFilter* filter, BadMessageReason reason);
285 
286 // Site isolation. These keys help debug renderer kills such as
287 // https://crbug.com/773140.
288 // Retuns a key for logging a requested SiteInfo.
289 base::debug::CrashKeyString* GetRequestedSiteInfoKey();
290 
291 }  // namespace bad_message
292 }  // namespace content
293 
294 #endif  // CONTENT_BROWSER_BAD_MESSAGE_H_
295