Skip to content

Commit 524dd3c

Browse files
bridiverthypon
authored andcommitted
Add rules for GetVisibleEntry, InProcessBrowserTest and WebContentsUserData and browser dependency inversion
1 parent 7b60299 commit 524dd3c

8 files changed

+135
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// ruleid: browser-dependency-inversion
2+
chrome::FindBrowserWithTab(web_contents);
3+
// ruleid: browser-dependency-inversion
4+
FindBrowserWithTab(web_contents);
5+
// ruleid: browser-dependency-inversion
6+
BrowserView::GetBrowserViewForNativeWindow();
7+
// ruleid: browser-dependency-inversion
8+
void MyClass::MyMethod(Browser* browser, bool test) { }
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
rules:
2+
- id: browser-dependency-inversion
3+
metadata:
4+
author: Brian Johnson <[email protected]>
5+
references:
6+
- https://chromium.googlesource.com/chromium/src/+/main/docs/chrome_browser_design_principles.md#structure_modularity
7+
source: https://github.com/brave/security-action/blob/main/assets/semgrep_rules/client/browser-dependency-inversion.yaml
8+
assignees: |
9+
goodov
10+
cdesouza-chromium
11+
bridiver
12+
category: correctness
13+
message: |
14+
There are several global functions that facilitate dependency inversion. It will not be possible to call them from modularized features (no dependency cycles), and their usage in non-modularized features is considered a red flag
15+
16+
Don't use Browser*. This is functionally a container of hundreds of other pointers. It is impossible to specify dependencies, since Browser* functionally depends on everything. Instead, pass in the relevant pointers, e.g. Profile*, FooFeatureController, etc
17+
18+
References:
19+
- https://chromium.googlesource.com/chromium/src/+/main/docs/chrome_browser_design_principles.md#structure_modularity
20+
severity: INFO
21+
languages:
22+
- cpp
23+
pattern-either:
24+
- patterns:
25+
- pattern: $FUNC(...)
26+
- metavariable-regex:
27+
metavariable: $FUNC
28+
regex: ^(chrome::)?(FindTabbedBrowser|FindAnyBrowser|FindBrowserWithProfile|FindAllTabbedBrowsersWithProfile|FindAllBrowsersWithProfile|FindBrowserWithID|FindBrowserWithWindow|FindBrowserWithActiveWindow|FindBrowserWithTab|FindBrowserWithGroup|FindBrowserWithUiElementContext|FindLastActiveWithProfile|FindLastActive|BrowserView::GetBrowserViewForNativeWindow|BrowserView::FindBrowserWindowWithWebContents)$
29+
- patterns:
30+
- pattern: $RETURN $FUNC(..., Browser* $BROWSER, ...) { ... }
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// ruleid: get-visible-entry
2+
web_contents->GetController().GetVisibleEntry();
3+
4+
// ruleid: get-visible-entry
5+
web_contents->GetVisibleURL();
6+
7+
// ok: get-visible-entry
8+
web_contents->GetLastCommittedURL();
9+
10+
// ok: get-visible-entry
11+
web_contents->GetController().GetLastCommittedEntry();
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
rules:
2+
- id: get-visible-entry
3+
metadata:
4+
author: Brian Johnson <[email protected]>
5+
references:
6+
- https://github.com/brave/brave-browser/wiki/Security-reviews
7+
confidence: MEDIUM
8+
source: https://github.com/brave/security-action/blob/main/assets/semgrep_rules/client/get-visible-entry.yaml
9+
assignees: |
10+
thypon
11+
diracdeltas
12+
bridiver
13+
category: security
14+
message: |
15+
$FUNC usages should be vet by the security-team. Most of the time you want the last committed entry/url
16+
severity: INFO
17+
languages:
18+
- cpp
19+
patterns:
20+
- pattern: $OBJ.$FUNC(...)
21+
- metavariable-regex:
22+
metavariable: $FUNC
23+
regex: ^(GetVisibleEntry|GetVisibleURL)$
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// ruleid: in-process-browser-test
2+
class MyTest : public InProcessBrowserTest {
3+
}
4+
5+
// ok: in-process-browser-test
6+
class MyTest : public PlatformBrowserTest {
7+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
rules:
2+
- id: in-process-browser-test
3+
metadata:
4+
author: Brian Johnson <[email protected]>
5+
source: https://github.com/brave/security-action/blob/main/assets/semgrep_rules/client/in-process-browser-test.yaml
6+
assignees: |
7+
goodov
8+
cdesouza-chromium
9+
bridiver
10+
category: correctness
11+
pattern: |
12+
class $CLASS : public InProcessBrowserTest
13+
message: "Most browser tests should be PlatformBrowserTest so they can run on android. "
14+
languages:
15+
- generic
16+
paths:
17+
include:
18+
- "*.cc"
19+
- "*.h"
20+
severity: WARNING
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// ruleid: web-contents-user-data
2+
class MyTest : public WebContentsUserData {
3+
}
4+
// ruleid: web-contents-user-data
5+
class MyTest : public content::WebContentsUserData {
6+
}
7+
// ok: web-contents-user-data
8+
class MyTest : public WebContentsObserver {
9+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
rules:
2+
- id: web-contents-user-data
3+
metadata:
4+
author: Brian Johnson <[email protected]>
5+
source: https://github.com/brave/security-action/blob/main/assets/semgrep_rules/client/in-process-browser-test.yaml
6+
assignees: |
7+
goodov
8+
cdesouza-chromium
9+
bridiver
10+
category: correctness
11+
references:
12+
- https://chromium.googlesource.com/chromium/src/+/main/docs/chrome_browser_design_principles.md#structure_modularity
13+
pattern-either:
14+
- pattern: public content::WebContentsUserData
15+
- pattern: public WebContentsUserData
16+
message: |
17+
Prefer dependency injection
18+
19+
References:
20+
- https://chromium.googlesource.com/chromium/src/+/main/docs/chrome_browser_design_principles.md#structure_modularity
21+
languages:
22+
- generic
23+
paths:
24+
include:
25+
- "*.cc"
26+
- "*.h"
27+
severity: INFO

0 commit comments

Comments
 (0)