Distinguish untrusted clients in v8 inspector and disable Profiler, HeapProfiler and Schema CDP domains for them.

Bug: chromium:1313437
Change-Id: I7544c64acb4bc368392ba5f6a87ed62176828304
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3616517
Reviewed-by: Yang Guo <yangguo@chromium.org>
Reviewed-by: Marja Hölttä <marja@chromium.org>
Commit-Queue: Danil Somsikov <dsv@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80340}
diff --git a/include/v8-inspector.h b/include/v8-inspector.h
index 0938c9f..1fb1c2c61 100644
--- a/include/v8-inspector.h
+++ b/include/v8-inspector.h
@@ -361,9 +361,18 @@
     virtual void sendNotification(std::unique_ptr<StringBuffer> message) = 0;
     virtual void flushProtocolNotifications() = 0;
   };
+  V8_DEPRECATED("Use version with client_is_trusted argument")
   virtual std::unique_ptr<V8InspectorSession> connect(int contextGroupId,
-                                                      Channel*,
-                                                      StringView state) = 0;
+                                                      Channel* channel,
+                                                      StringView state) {
+    return connect(contextGroupId, channel, state, kFullyTrusted);
+  }
+  enum ClientTrustLevel { kUntrusted, kFullyTrusted };
+  virtual std::unique_ptr<V8InspectorSession> connect(
+      int contextGroupId, Channel*, StringView state,
+      ClientTrustLevel client_trust_level) {
+    return nullptr;
+  }
 
   // API methods.
   virtual std::unique_ptr<V8StackTrace> createStackTrace(
diff --git a/src/d8/d8.cc b/src/d8/d8.cc
index abb8c07..1f46b5d 100644
--- a/src/d8/d8.cc
+++ b/src/d8/d8.cc
@@ -3889,7 +3889,8 @@
     channel_.reset(new InspectorFrontend(context));
     inspector_ = v8_inspector::V8Inspector::create(isolate_, this);
     session_ =
-        inspector_->connect(1, channel_.get(), v8_inspector::StringView());
+        inspector_->connect(1, channel_.get(), v8_inspector::StringView(),
+                            v8_inspector::V8Inspector::kFullyTrusted);
     context->SetAlignedPointerInEmbedderData(kInspectorClientIndex, this);
     inspector_->contextCreated(v8_inspector::V8ContextInfo(
         context, kContextGroupId, v8_inspector::StringView()));
diff --git a/src/inspector/v8-inspector-impl.cc b/src/inspector/v8-inspector-impl.cc
index c0fd6a7..bf00e5c 100644
--- a/src/inspector/v8-inspector-impl.cc
+++ b/src/inspector/v8-inspector-impl.cc
@@ -146,11 +146,12 @@
 }
 
 std::unique_ptr<V8InspectorSession> V8InspectorImpl::connect(
-    int contextGroupId, V8Inspector::Channel* channel, StringView state) {
+    int contextGroupId, V8Inspector::Channel* channel, StringView state,
+    ClientTrustLevel client_trust_level) {
   int sessionId = ++m_lastSessionId;
   std::unique_ptr<V8InspectorSessionImpl> session =
       V8InspectorSessionImpl::create(this, contextGroupId, sessionId, channel,
-                                     state);
+                                     state, client_trust_level);
   m_sessions[contextGroupId][sessionId] = session.get();
   return std::move(session);
 }
diff --git a/src/inspector/v8-inspector-impl.h b/src/inspector/v8-inspector-impl.h
index 4a3e9bf..d4eb25d 100644
--- a/src/inspector/v8-inspector-impl.h
+++ b/src/inspector/v8-inspector-impl.h
@@ -80,7 +80,8 @@
   // V8Inspector implementation.
   std::unique_ptr<V8InspectorSession> connect(int contextGroupId,
                                               V8Inspector::Channel*,
-                                              StringView state) override;
+                                              StringView state,
+                                              ClientTrustLevel) override;
   void contextCreated(const V8ContextInfo&) override;
   void contextDestroyed(v8::Local<v8::Context>) override;
   v8::MaybeLocal<v8::Context> contextById(int contextId) override;
diff --git a/src/inspector/v8-inspector-session-impl.cc b/src/inspector/v8-inspector-session-impl.cc
index e6e50d5..4aaf4b2 100644
--- a/src/inspector/v8-inspector-session-impl.cc
+++ b/src/inspector/v8-inspector-session-impl.cc
@@ -87,16 +87,16 @@
 
 std::unique_ptr<V8InspectorSessionImpl> V8InspectorSessionImpl::create(
     V8InspectorImpl* inspector, int contextGroupId, int sessionId,
-    V8Inspector::Channel* channel, StringView state) {
+    V8Inspector::Channel* channel, StringView state,
+    V8Inspector::ClientTrustLevel clientTrustLevel) {
   return std::unique_ptr<V8InspectorSessionImpl>(new V8InspectorSessionImpl(
-      inspector, contextGroupId, sessionId, channel, state));
+      inspector, contextGroupId, sessionId, channel, state, clientTrustLevel));
 }
 
-V8InspectorSessionImpl::V8InspectorSessionImpl(V8InspectorImpl* inspector,
-                                               int contextGroupId,
-                                               int sessionId,
-                                               V8Inspector::Channel* channel,
-                                               StringView savedState)
+V8InspectorSessionImpl::V8InspectorSessionImpl(
+    V8InspectorImpl* inspector, int contextGroupId, int sessionId,
+    V8Inspector::Channel* channel, StringView savedState,
+    V8Inspector::ClientTrustLevel clientTrustLevel)
     : m_contextGroupId(contextGroupId),
       m_sessionId(sessionId),
       m_inspector(inspector),
@@ -109,7 +109,8 @@
       m_heapProfilerAgent(nullptr),
       m_profilerAgent(nullptr),
       m_consoleAgent(nullptr),
-      m_schemaAgent(nullptr) {
+      m_schemaAgent(nullptr),
+      m_clientTrustLevel(clientTrustLevel) {
   m_state->getBoolean("use_binary_protocol", &use_binary_protocol_);
 
   m_runtimeAgent.reset(new V8RuntimeAgentImpl(
@@ -120,28 +121,29 @@
       this, this, agentState(protocol::Debugger::Metainfo::domainName)));
   protocol::Debugger::Dispatcher::wire(&m_dispatcher, m_debuggerAgent.get());
 
-  m_profilerAgent.reset(new V8ProfilerAgentImpl(
-      this, this, agentState(protocol::Profiler::Metainfo::domainName)));
-  protocol::Profiler::Dispatcher::wire(&m_dispatcher, m_profilerAgent.get());
-
-  m_heapProfilerAgent.reset(new V8HeapProfilerAgentImpl(
-      this, this, agentState(protocol::HeapProfiler::Metainfo::domainName)));
-  protocol::HeapProfiler::Dispatcher::wire(&m_dispatcher,
-                                           m_heapProfilerAgent.get());
-
   m_consoleAgent.reset(new V8ConsoleAgentImpl(
       this, this, agentState(protocol::Console::Metainfo::domainName)));
   protocol::Console::Dispatcher::wire(&m_dispatcher, m_consoleAgent.get());
 
-  m_schemaAgent.reset(new V8SchemaAgentImpl(
-      this, this, agentState(protocol::Schema::Metainfo::domainName)));
-  protocol::Schema::Dispatcher::wire(&m_dispatcher, m_schemaAgent.get());
+  if (m_clientTrustLevel == V8Inspector::kFullyTrusted) {
+    m_profilerAgent.reset(new V8ProfilerAgentImpl(
+        this, this, agentState(protocol::Profiler::Metainfo::domainName)));
+    protocol::Profiler::Dispatcher::wire(&m_dispatcher, m_profilerAgent.get());
 
+    m_heapProfilerAgent.reset(new V8HeapProfilerAgentImpl(
+        this, this, agentState(protocol::HeapProfiler::Metainfo::domainName)));
+    protocol::HeapProfiler::Dispatcher::wire(&m_dispatcher,
+                                             m_heapProfilerAgent.get());
+
+    m_schemaAgent.reset(new V8SchemaAgentImpl(
+        this, this, agentState(protocol::Schema::Metainfo::domainName)));
+    protocol::Schema::Dispatcher::wire(&m_dispatcher, m_schemaAgent.get());
+  }
   if (savedState.length()) {
     m_runtimeAgent->restore();
     m_debuggerAgent->restore();
-    m_heapProfilerAgent->restore();
-    m_profilerAgent->restore();
+    if (m_heapProfilerAgent) m_heapProfilerAgent->restore();
+    if (m_profilerAgent) m_profilerAgent->restore();
     m_consoleAgent->restore();
   }
 }
@@ -150,8 +152,8 @@
   v8::Isolate::Scope scope(m_inspector->isolate());
   discardInjectedScripts();
   m_consoleAgent->disable();
-  m_profilerAgent->disable();
-  m_heapProfilerAgent->disable();
+  if (m_profilerAgent) m_profilerAgent->disable();
+  if (m_heapProfilerAgent) m_heapProfilerAgent->disable();
   m_debuggerAgent->disable();
   m_runtimeAgent->disable();
   m_inspector->disconnect(this);
@@ -499,7 +501,8 @@
 
 void V8InspectorSessionImpl::triggerPreciseCoverageDeltaUpdate(
     StringView occasion) {
-  m_profilerAgent->triggerPreciseCoverageDeltaUpdate(toString16(occasion));
+  if (m_profilerAgent)
+    m_profilerAgent->triggerPreciseCoverageDeltaUpdate(toString16(occasion));
 }
 
 }  // namespace v8_inspector
diff --git a/src/inspector/v8-inspector-session-impl.h b/src/inspector/v8-inspector-session-impl.h
index 5d874264..85bf4cb 100644
--- a/src/inspector/v8-inspector-session-impl.h
+++ b/src/inspector/v8-inspector-session-impl.h
@@ -32,11 +32,10 @@
 class V8InspectorSessionImpl : public V8InspectorSession,
                                public protocol::FrontendChannel {
  public:
-  static std::unique_ptr<V8InspectorSessionImpl> create(V8InspectorImpl*,
-                                                        int contextGroupId,
-                                                        int sessionId,
-                                                        V8Inspector::Channel*,
-                                                        StringView state);
+  static std::unique_ptr<V8InspectorSessionImpl> create(
+      V8InspectorImpl*, int contextGroupId, int sessionId,
+      V8Inspector::Channel*, StringView state,
+      v8_inspector::V8Inspector::ClientTrustLevel);
   ~V8InspectorSessionImpl() override;
   V8InspectorSessionImpl(const V8InspectorSessionImpl&) = delete;
   V8InspectorSessionImpl& operator=(const V8InspectorSessionImpl&) = delete;
@@ -102,7 +101,8 @@
 
  private:
   V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, int sessionId,
-                         V8Inspector::Channel*, StringView state);
+                         V8Inspector::Channel*, StringView state,
+                         V8Inspector::ClientTrustLevel);
   protocol::DictionaryValue* agentState(const String16& name);
 
   // protocol::FrontendChannel implementation.
@@ -134,6 +134,7 @@
   std::vector<std::unique_ptr<V8InspectorSession::Inspectable>>
       m_inspectedObjects;
   bool use_binary_protocol_ = false;
+  V8Inspector::ClientTrustLevel m_clientTrustLevel = V8Inspector::kUntrusted;
 };
 
 }  // namespace v8_inspector
diff --git a/test/cctest/test-inspector.cc b/test/cctest/test-inspector.cc
index 49a08bc..29576af 100644
--- a/test/cctest/test-inspector.cc
+++ b/test/cctest/test-inspector.cc
@@ -56,8 +56,8 @@
   NoopChannel channel;
   const char* state = "{}";
   StringView state_view(reinterpret_cast<const uint8_t*>(state), strlen(state));
-  std::unique_ptr<V8InspectorSession> session =
-      inspector->connect(1, &channel, state_view);
+  std::unique_ptr<V8InspectorSession> session = inspector->connect(
+      1, &channel, state_view, v8_inspector::V8Inspector::kFullyTrusted);
 
   const char* object_group = "";
   StringView object_group_view(reinterpret_cast<const uint8_t*>(object_group),
diff --git a/test/inspector/isolate-data.cc b/test/inspector/isolate-data.cc
index e26a955..68754ec 100644
--- a/test/inspector/isolate-data.cc
+++ b/test/inspector/isolate-data.cc
@@ -163,7 +163,9 @@
     v8_inspector::V8Inspector::Channel* channel) {
   v8::SealHandleScope seal_handle_scope(isolate());
   int session_id = ++last_session_id_;
-  sessions_[session_id] = inspector_->connect(context_group_id, channel, state);
+  sessions_[session_id] =
+      inspector_->connect(context_group_id, channel, state,
+                          v8_inspector::V8Inspector::kFullyTrusted);
   context_group_by_session_[sessions_[session_id].get()] = context_group_id;
   return session_id;
 }