.. | ||
browext-clickjacking.md | ||
browext-permissions-and-host_permissions.md | ||
browext-xss-example.md | ||
README.md |
Browser Extension Pentesting Methodology
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Basic Information
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ DOM рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ DOM рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рд╕рд╛рдЗрдЯреЛрдВ рдХреА рдЧреЛрдкрдиреАрдпрддрд╛, рдЕрдЦрдВрдбрддрд╛ рдФрд░ рдЙрдкрд▓рдмреНрдзрддрд╛ (CIA) рдХреЛ рдЦрддрд░реЗ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред
Main Components
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЗрдЖрдЙрдЯ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВ рдЬрдм рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рддреАрди рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВред рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦреЗрдВред
Content Scripts
рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╛рд╕ рдПрдХрд▓ рд╡реЗрдм рдкреГрд╖реНрда рдХреЗ DOM рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
Extension Core
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░/рдкрд╣реБрдБрдЪ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдХреЗрд╡рд▓ XMLHttpRequest рдФрд░ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдХреЗ рдкрд╛рд╕ рд╣реЛрд╕реНрдЯ рдорд╢реАрди рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
Native Binary
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рдиреИрдЯрд┐рд╡ рдмрд╛рдЗрдирд░реА рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯ рдорд╢реАрди рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдиреИрдЯрд┐рд╡ рдмрд╛рдЗрдирд░реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдиреЗрдЯрд╕реНрдХреЗрдк рдкреНрд▓рдЧрдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ (NPAPI) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлреНрд▓реИрд╢ рдФрд░ рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд▓рдЧ-рдЗрдиреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Boundaries
{% hint style="danger" %} рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдпрд╣ рдордирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рд╡рд╣ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЗрдирдкреБрдЯ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрд░ рдореЗрдВ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрд░ рд╕реЗ рдиреИрдЯрд┐рд╡ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗред {% endhint %}
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдордЬрдмреВрдд рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рд╕реАрдорд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рд╕реЗ рдЕрд▓рдЧ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реАрдк рдореЗрдВ рдЪрд▓рддреА рд╣реИред рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡реЗрдм рдкреГрд╖реНрда рдПрдХ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд DOM рддрдХ рдкрд╣реБрдВрдЪ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдХрднреА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ, рдЬрд┐рд╕рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд▓реАрдХ рд╣реЛрдирд╛ рд░реЛрдХрддрд╛ рд╣реИред
manifest.json
рдПрдХ рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрд╕ рдПрдХ рдЬрд╝рд┐рдк рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ .crx рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛрддрд╛ рд╣реИред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдХреЛрд░ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдЯ рдореЗрдВ manifest.json
рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬреЛ рд▓реЗрдЖрдЙрдЯ, рдЕрдиреБрдорддрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
Example:
{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}
content_scripts
рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд▓реЛрдб рд╣реЛрддреА рд╣реИрдВ рдЬрдм рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рднреА рдкреГрд╖реНрда рдЬреЛ https://example.com/*
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ *://*/*/business*
regex рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ред рдпреЗ рдкреГрд╖реНрда рдХреЗ рдЕрдкрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдкреГрд╖реНрда рдХреЗ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ (DOM) рддрдХ рдордирдорд╛рдирд╛ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
рдЕрдзрд┐рдХ URLs рдХреЛ рд╢рд╛рдорд┐рд▓ рдпрд╛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП include_globs
рдФрд░ exclude_globs
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред
рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдкреГрд╖реНрда рдкрд░ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдмрдЯрди рдЬреЛрдбрд╝реЗрдЧреА рдЬрдм рд╕реНрдЯреЛрд░реЗрдЬ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ message
рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});
рдЬрдм рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, runtime.sendMessage() API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдпрд╣ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА APIs рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдХреА рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬрд┐рд╕рдореЗрдВ storage
рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрди рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдкрд░реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрджреЗрд╢ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреГрд╖реНрдареЛрдВ рдкрд░ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреА рд╣реИрдВред
{% hint style="warning" %}
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдХреНрд╖рдорддрд╛рдПрдБ рдереЛрдбрд╝реА рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреНрд░реЛрдорд┐рдпрдо-рдЖрдзрд╛рд░рд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рд╕реВрдЪреА Chrome Developers documentation рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП, MDN рдкреНрд░рд╛рдердорд┐рдХ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╛рд╕ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рд╡рд╛рдкрд╕ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред
{% endhint %}
Chrome рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Chrome рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдореЗрдиреВ рдХреЛ Options > More tools > Developer tools рд╕реЗ рдпрд╛ Ctrl + Shift + I рджрдмрд╛рдХрд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░, Source tab рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕рдХреЗ рдмрд╛рдж Content Scripts рдЯреИрдмред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рд╕реЗ рдЪрд▓ рд░рд╣реА рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
Injected content scripts
{% hint style="success" %}
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Content Scripts рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд╛рдпрдирд╛рдорд┐рдХрд▓реА inject рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдФрд░ tabs.executeScript
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХрд▓реА рдЙрдиреНрд╣реЗрдВ inject рдХрд░рдиреЗ рдХреА рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ granular controls рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
{% endhint %}
рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЙрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП host permissions рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдпреЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдпрд╛ рддреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдЙрдирдХреА рдорд╛рдВрдЧ рдХрд░рдХреЗ рдпрд╛ activeTab рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдЖрдзрд╛рд░ рдкрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
Example activeTab-based extension
{% code title="manifest.json" %}
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
{% endcode %}
- рдХреНрд▓рд┐рдХ рдкрд░ рдПрдХ JS рдлрд╝рд╛рдЗрд▓ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ:
// content-script.js
document.body.style.backgroundColor = "orange";
//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
- рдХреНрд▓рд┐рдХ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ:
//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});
рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг
// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);
// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
URLs рдХреЛ рд╢рд╛рдорд┐рд▓ рдпрд╛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП include_globs
рдФрд░ exclude_globs
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред
рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ run_at
run_at
рдлрд╝реАрд▓реНрдб рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ JavaScript рдлрд╝рд╛рдЗрд▓реЗрдВ рд╡реЗрдм рдкреГрд╖реНрда рдореЗрдВ рдХрдм рдЗрдВрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдкрд╕рдВрджреАрджрд╛ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди "document_idle"
рд╣реИред
рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди рд╣реИрдВ:
document_idle
: рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛdocument_start
:css
рд╕реЗ рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдж, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп DOM рдХреЗ рдирд┐рд░реНрдорд╛рдг рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗредdocument_end
: DOM рдХреЗ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд▓реЗрдХрд┐рди рдЫрд╡рд┐рдпреЛрдВ рдФрд░ рдлрд╝реНрд░реЗрдо рдЬреИрд╕реА рдЙрдк-рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред
manifest.json
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}
service-worker.js
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);
background
рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рдордиреНрд╡рдп рдореЗрдВ рдПрдХ рдХреЗрдВрджреНрд░реАрдп рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рджреМрд░рд╛рди рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ (DOM) рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЬрдЯрд┐рд▓ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдФрд░ рд╕реНрдерд┐рддрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред
рдореБрдЦреНрдп рдмрд┐рдВрджреБ:
- рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдХреА рднреВрдорд┐рдХрд╛: рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдирд░реНрд╡ рд╕реЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдФрд░ рд╕рдордиреНрд╡рдп рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
- рд╕реНрдерд┐рд░рддрд╛: рдпрд╣ рдПрдХ рд╣рдореЗрд╢рд╛ рдЙрдкрд╕реНрдерд┐рдд рдЗрдХрд╛рдИ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рд▓реЗрдХрд┐рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдпред
- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд░реНрдорд╛рдг: рдпрджрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдкреГрд╖реНрда рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдмрд╛рдз рд╕рдВрдЪрд╛рд▓рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред
{% hint style="success" %} рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреЗрдЬ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ (рдЬрдм рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ) рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХреАрдХреГрдд рдФрд░ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реЗрдЯрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред {% endhint %}
Example background script:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})
рдпрд╣ runtime.onMessage API рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рдЬрдм рдПрдХ "explain"
рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ tabs API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдП рдЯреИрдм рдореЗрдВ рдПрдХ рдкреГрд╖реНрда рдЦреЛрд▓рддрд╛ рд╣реИред
рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рд╡рд░рдг рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓реНрд╕ рдЦреБрд▓реЗрдВрдЧреЗ:
рд╡рд┐рдХрд▓реНрдк рдкреГрд╖реНрда рдФрд░ рдЕрдиреНрдп
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреГрд╖реНрда рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдПрдХреНрд╢рди рдкреГрд╖реНрда рддрдм рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдкреГрд╖реНрда рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рдирдП рдЯреИрдм рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред
- рд╡рд┐рдХрд▓реНрдк рдкреГрд╖реНрда: рдпрд╣ рдкреГрд╖реНрда рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдкреГрд╖реНрда рддрдХ
chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
рдореЗрдВ рдкрд╣реБрдБрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдпрд╛ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ:
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпреЗ рдкреГрд╖реНрда рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреГрд╖реНрдареЛрдВ рдХреА рддрд░рд╣ рд╕реНрдерд╛рдпреА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧрддрд┐рд╢реАрд▓ рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╡реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХреНрд╖рдорддрд╛рдПрдБ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ:
- рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░: рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреГрд╖реНрда рдХреЗ рд╕рдорд╛рди, рдпреЗ рдкреГрд╖реНрда рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рднреАрддрд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред
- рдПрдХреНрд╕рдЯреЗрдВрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ APIs рддрдХ рдкрд╣реБрдБрдЪ: рдЗрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ APIs рддрдХ рд╡реНрдпрд╛рдкрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдЕрдзреАрди рд╣реЛрддреА рд╣реИред
permissions
& host_permissions
permissions
рдФрд░ host_permissions
manifest.json
рд╕реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдпрд╣ рд╕рдВрдХреЗрдд рдХрд░реЗрдВрдЧреА рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реА рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реИрдВ (рд╕реНрдЯреЛрд░реЗрдЬ, рд╕реНрдерд╛рди...) рдФрд░ рдХреМрди рд╕реЗ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдореЗрдВред
рдЪреВрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрддрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдпрд╛ рдПрдХ рдЬреЛ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЪреБрд░рд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдЬрд╛рд╕реВрд╕реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдзрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдФрд░ рдХреИрд╕реЗ рдЗрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
{% content-ref url="browext-permissions-and-host_permissions.md" %} browext-permissions-and-host_permissions.md {% endcontent-ref %}
content_security_policy
рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдХреЛ manifest.json
рдХреЗ рдЕрдВрджрд░ рднреА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рддреЛ рдпрд╣ рдХрдордЬреЛрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛рдлреА рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИ:
script-src 'self'; object-src 'self';
CSP рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдмрд╛рдпрдкрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:
{% content-ref url="../content-security-policy-csp-bypass/" %} content-security-policy-csp-bypass {% endcontent-ref %}
web_accessible_resources
рдХрд┐рд╕реА рд╡реЗрдмрдкреЗрдЬ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдПрдХ рдкреГрд╖реНрда, рдЬреИрд╕реЗ рдХрд┐ .html
рдкреГрд╖реНрда, рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреГрд╖реНрда рдХреЛ manifest.json
рдХреЗ web_accessible_resources
рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}
рдпреЗ рдкреГрд╖реНрда URL рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд╣реБрдБрдЪ рдпреЛрдЧреНрдп рд╣реИрдВ:
chrome-extension://<extension-id>/message.html
In рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдореЗрдВ extension-id рдЙрдкрд▓рдмреНрдз рд╣реИ:
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ manifest.json
рдкреИрд░рд╛рдореАрдЯрд░ use_dynamic_url
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ id рдЧрддрд┐рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
{% hint style="success" %} рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рдкреГрд╖реНрда рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реЛрдиреЗ рдкрд░ рднреА, рдпрд╣ ClickJacking рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж Content Security Policy рдХреЗред рдЗрд╕рд▓рд┐рдП ClickJacking рд╣рдорд▓реЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕реЗ рднреА рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ (frame-ancestors рдЕрдиреБрднрд╛рдЧ)ред {% endhint %}
рдЗрди рдкреГрд╖реНрдареЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдиреЗ рд╕реЗ рдпреЗ рдкреГрд╖реНрда рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдордЬреЛрд░ ClickJacking рдмрди рдЬрд╛рддреЗ рд╣реИрдВ:
{% content-ref url="browext-clickjacking.md" %} browext-clickjacking.md {% endcontent-ref %}
{% hint style="success" %} рдЗрди рдкреГрд╖реНрдареЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ URLs рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, ClickJacking рд╣рдорд▓реЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред {% endhint %}
{% hint style="danger" %}
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ web_accessible_resources
рд╕реЗ рдкреГрд╖реНрда рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЕрдиреНрдп рдкреГрд╖реНрда рднреА рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдкреГрд╖реНрда XSS рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдмрдбрд╝реА рдХрдордЬреЛрд░реА рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ web_accessible_resources
рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреГрд╖реНрдареЛрдВ рдХреЛ iframes рдХреЗ рдЕрдВрджрд░ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдирдП рдЯреИрдм рд╕реЗ рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрд╢рди ID рдЬрд╛рдирдХрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдПрдХ XSS рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рднрд▓реЗ рд╣реА рдкреГрд╖реНрда web_accessible_resources
рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
{% endhint %}
externally_connectable
docs рдХреЗ рдЕрдиреБрд╕рд╛рд░, "externally_connectable"
рдореИрдирд┐рдлреЗрд╕реНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рд╡реЗрдм рдкреГрд╖реНрда рдЖрдкрдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ runtime.connect рдФрд░ runtime.sendMessage рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдпрджрд┐
externally_connectable
рдХреБрдВрдЬреА рдЖрдкрдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдирд╣реАрдВ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ рдпрд╛ рдЗрд╕реЗ"ids": ["*"]
рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╡реЗрдм рдкреГрд╖реНрда рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред - рдпрджрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ IDs рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рд╣реИрдВ, рдЬреИрд╕реЗ
"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
, рддреЛ рдХреЗрд╡рд▓ рд╡рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - рдпрджрд┐ matches рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рд╡реЗ рд╡реЗрдм рдРрдкреНрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХреЗрдВрдЧреЗ:
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
- рдпрджрд┐ рдЗрд╕реЗ рдЦрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
"externally_connectable": {}
, рддреЛ рдХреЛрдИ рдРрдк рдпрд╛ рд╡реЗрдм рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗрдЧрд╛ред
рдпрд╣рд╛рдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ URL рдХреЗ рд╕рд╛рде, рд╣рдорд▓рд╛ рд╕рддрд╣ рдЫреЛрдЯреА рд╣реЛрдЧреАред
{% hint style="danger" %}
рдпрджрд┐ рдПрдХ рд╡реЗрдм рдкреГрд╖реНрда XSS рдпрд╛ рдЯреЗрдХрдУрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ externally_connectable
рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реАрдзреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдЗрд╕рдХреЗ CSP рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдПред
рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрд╛рдпрдкрд╛рд╕ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд░реЙрдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рд╣реЛ, рдпрд╣ XSS рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдЕрдиреБрдордд рд╡реЗрдм рдкреГрд╖реНрда рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ WebRequest
рдпрд╛ DeclarativeNetRequest
APIs рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рдХреНрд╖рд┐рдд рдбреЛрдореЗрди рдкрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдПрдХ рдкреГрд╖реНрда рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ JavaScript рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХреЗред (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдкрд░ CSP рдЗрди рд╣рдорд▓реЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдЖрдпрд╛ рд╣реИред
{% endhint %}
рд╕рдВрдЪрд╛рд░ рд╕рд╛рд░рд╛рдВрд╢
рдПрдХреНрд╕рдЯреЗрдВрд╢рди <--> рд╡реЗрдм рдРрдк
рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡реЗрдм рдкреГрд╖реНрда рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдЖрдорддреМрд░ рдкрд░ window.postMessage
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдорд┐рд▓реЗрдВрдЧреЗ рдФрд░ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ window.addEventListener
рдЬреИрд╕реЗ рд╢реНрд░реЛрддрд╛ рдорд┐рд▓реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рднреА рдПрдХ рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢ рднреЗрдЬрдХрд░ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗрдм рдХреЛ рдЗрд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП) рдпрд╛ рдмрд╕ рд╡реЗрдм рдХреЛ рдПрдХ рдирдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЕрдВрджрд░
рдЖрдо рддреМрд░ рдкрд░ chrome.runtime.sendMessage
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ background
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЛрддрд╛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ chrome.runtime.onMessage.addListener
рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ chrome.runtime.connect()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдерд╛рдпреА рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХрд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ, рдЗрд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:
chrome.runtime.connect()
рдЙрджрд╛рд╣рд░рдг
```javascript
var port = chrome.runtime.connect();
// Listen for messages from the web page window.addEventListener("message", (event) => { // Only accept messages from the same window if (event.source !== window) { return; }
// Check if the message type is "FROM_PAGE" if (event.data.type && (event.data.type === "FROM_PAGE")) { console.log("Content script received: " + event.data.text); // Forward the message to the background script port.postMessage({ type: 'FROM_PAGE', text: event.data.text }); } }, false);
// Listen for messages from the background script port.onMessage.addListener(function(msg) { console.log("Content script received message from background script:", msg); // Handle the response message from the background script });
</details>
рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдПрдХ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЬрд╛рдП рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЯреИрдм рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, **`chrome.tabs.sendMessage`** рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП **рдЯреИрдм рдХрд╛ ID** рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
### рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд `externally_connectable` рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рддрдХ
**рд╡реЗрдм рдРрдкреНрд╕ рдФрд░ рдмрд╛рд╣рд░реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛ `externally_connectable` рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реИрдВ** рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:
```javascript
chrome.runtime.sendMessage(extensionId, ...
рдЬрд╣рд╛рдБ extension ID рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
Native Messaging
рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдВрджрд░ рдмрд╛рдЗрдирд░реА рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░реЗрдВ, рдЬреЛ рдХрд┐ рдпрджрд┐ рдЗрд╕ рд╕рдВрд╡рд╛рдж рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдЬреИрд╕реЗ RCEs рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХред
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);
Web тЖФя╕О Content Script Communication
рдЬрд╣рд╛рдБ content scripts рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдБ рд╣реЛрд╕реНрдЯ рдкреГрд╖реНрда рдореМрдЬреВрдж рд╣реИрдВ, рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ, рдЬреЛ рдЕрд▓рдЧрд╛рд╡ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рдкреГрд╖реНрда рдХреЗ Document Object Model (DOM) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИред рд╣реЛрд╕реНрдЯ рдкреГрд╖реНрда рдХреЛ content script рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ content script рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде, рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрд▓рдн DOM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рдВрд╡рд╛рдж рдЪреИрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
Post Messages
{% code title="content-script.js" %}
// This is like "chrome.runtime.sendMessage" but to maintain the connection
var port = chrome.runtime.connect();
window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}
if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
// Forward the message to the background script
port.postMessage(event.data.text);
}
}, false);
{% endcode %}
{% code title="example.js" %}
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);
{% endcode %}
рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд Post Message рд╕рдВрдЪрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢ рдХреА рдкреНрд░рд╛рдорд╛рдгрд┐рдХрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
event.isTrusted
: рдпрд╣ рдХреЗрд╡рд▓ рддрдм True рд╣реИ рдЬрдм рдШрдЯрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреА рдЧрдИ рд╣реЛ- рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ рддрднреА рд╕рдВрджреЗрд╢ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛ рдХрд░реЗ
- origin domain: рдХреЗрд╡рд▓ рдбреЛрдореЗрди рдХреА рдЕрдиреБрдорддрд┐ рд╕реВрдЪреА рд╕реЗ рд╕рдВрджреЗрд╢ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреА рд╣реИред
- рдпрджрд┐ regex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ
- Source:
received_message.source !== window
рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдЙрд╕реА рд╡рд┐рдВрдбреЛ рд╕реЗ рдерд╛ рдЬрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрди рд░рд╣реА рд╣реИред
рдкрд┐рдЫрд▓реА рдЬрд╛рдВрдЪреЗрдВ, рднрд▓реЗ рд╣реА рдХреА рдЧрдИ рд╣реЛрдВ, рдХрдордЬреЛрд░ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд Post Message рдмрд╛рдпрдкрд╛рд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:
{% content-ref url="../postmessage-vulnerabilities/" %} postmessage-vulnerabilities {% endcontent-ref %}
Iframe
рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ Iframe URLs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
DOM
рдпрд╣ "рд╕рдЯреАрдХ" рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗрдм рдФрд░ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╡реЗрдм DOM рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕рд╕реЗ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝ рд░рд╣реА рд╣реИ, рд╡реЗрдм DOM рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, рддреЛ рд╡реЗрдм рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрдм рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрдм XSS рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ) рдФрд░ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдордЭреМрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рдПрдХ DOM рдЖрдзрд╛рд░рд┐рдд XSS рд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рднреА рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ тЖФя╕О рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдЪрд╛рд░
рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ runtime.sendMessage() рдпрд╛ tabs.sendMessage() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдПрдХ рдмрд╛рд░ JSON-рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрдмрд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреА рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реМрдЯрд╛рдП рдЧрдП Promise рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреАрдЫреЗ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрднреА рднреА рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ callback рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ)ред рдЪрдпрдирд┐рдд рдЯреИрдм рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
On the receiving end, you need to set up an runtime.onMessage рдЗрд╡реЗрдВрдЯ рд▓рд┐рд╕рдирд░ to handle the message. This looks the same from a content script or extension page.
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛, sendResponse()
рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред sendResponse()
рдХреЗ рдЕрд╕рдордХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП onMessage
рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, return true;
рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдХрдИ рдкреГрд╖реНрда onMessage
рдЗрд╡реЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП sendResponse()
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдкреГрд╖реНрда рд╣реА рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЙрд╕реА рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдмрд╛рдж рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдирдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рд╡рд╛рджреЛрдВ рдХреА рдУрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рди рдХрд┐ рдХреЙрд▓рдмреИрдХ рдХреАред рдХреЙрд▓рдмреИрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, sendResponse()
рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рд╕реАрдзреЗ рд╕рдордХрд╛рд▓рд┐рдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╛ рдпрджрд┐ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ true
рд▓реМрдЯрд╛рдХрд░ рдЕрд╕рдордХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рднреА рд╣реИрдВрдбрд▓рд░ true
рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ sendResponse()
рдлрд╝рдВрдХреНрд╢рди рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЧрд╛рд░рдмреЗрдЬ-рдХрд▓реЗрдХреНрдЯреЗрдб), рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ sendMessage()
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдмреИрдХ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдиреЗрдЯреАрд╡ рдореИрд╕реЗрдЬрд┐рдВрдЧ
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди stdin рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрд╛рдЗрдирд░реА рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддреЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ json рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ:
{
"name": "com.my_company.my_application",
"description": "My Application",
"path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
"type": "stdio",
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}
рдЬрд╣рд╛рдБ name
рд╡рд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬреЛ runtime.connectNative()
рдпрд╛ runtime.sendNativeMessage()
рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред path
рдмрд╛рдЗрдирд░реА рдХрд╛ рдкрде рд╣реИ, рдХреЗрд╡рд▓ 1 рдорд╛рдиреНрдп type
рд╣реИ рдЬреЛ stdio рд╣реИ (stdin рдФрд░ stdout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) рдФрд░ allowed_origins
рдЙрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)ред
Chrome/Chromium рдЗрд╕ json рдХреЛ рдХреБрдЫ рд╡рд┐рдВрдбреЛрдЬ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдФрд░ macOS рдФрд░ Linux рдореЗрдВ рдХреБрдЫ рдкрдереЛрдВ рдореЗрдВ рдЦреЛрдЬреЗрдЧрд╛ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП docs рдореЗрдВ рджреЗрдЦреЗрдВ)ред
{% hint style="success" %}
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЗрд╕ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП nativeMessaing
рдЕрдиреБрдорддрд┐ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
{% endhint %}
рдпрд╣рд╛рдБ рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рдиреЗрдЯрд┐рд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ:
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);
In рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░ рдкреИрдЯрд░реНрди рдЬреЛ рдХрд┐ рдиреЗрдЯрд┐рд╡ рдореИрд╕реЗрдЬреЗрд╕ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдкреИрдЯрд░реНрди рд╣реИред
- рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
sendMessage
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛpostMessage
рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред - рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ
sendNativeMessage
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд┐рд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред - рдиреЗрдЯрд┐рд╡ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджреЗрд╢ рдХреЛ рдЦрддрд░рдирд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рд╕реЗ RCE рддрдХ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореЗрдореЛрд░реА/рдХреЛрдб/рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА
рдпрджрд┐ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЕрдкрдиреА рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрдВрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдорд╢реАрдиреЛрдВ рдореЗрдВ) рдФрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдорд╛рдиреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдпрд╛ рдореНрдиреЗрдореЛрдирд┐рдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред
рдмреЗрд╢рдХ, рдХреЛрдб рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рди рдбрд╛рд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдЧреАред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдореЗрдореЛрд░реА рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдореЛрд░реА рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Inspect pop-up
рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ -> Memory
рд╕реЗрдХреНрд╢рди рдореЗрдВ -> Take a snapshot
рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рдЕрдВрджрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП CTRL+F
рджрдмрд╛рдПрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдореНрдиреЗрдореЛрдирд┐рдХ рдХреА рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ) рдХреНрдпреЛрдВрдХрд┐ рддрдм рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВрдЧреАред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЛрдб рдХрд░рдирд╛
- рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдВ
chrome://extensions/
рдкрд░ рдЬрд╛рдПрдВ рдФрд░Developer Mode
рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВLoad unpacked
рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдореЗрдВ рдЖрдк about:debugging#/runtime/this-firefox
рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ Load Temporary Add-on
рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрдЯреЛрд░ рд╕реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдПрдХ рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ZIP рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдПрдХ рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ZIP рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ URL рд╕реЗ ZIP рдлрд╝рд╛рдЗрд▓ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП curl
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ ZIP рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рдХрд╛рд▓рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣рд╛рдБ рдХрджрдо рд╣реИрдВ:
"extension_id"
рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ ID рд╕реЗ рдмрджрд▓реЗрдВред- рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
extension_id=your_extension_id # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"
CRX Viewer рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
CRX Viewer рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдПрдХ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдзрд┐ Chrome Extension Source Viewer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред рдЗрд╕реЗ Chrome Web Store рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпреВрдЕрд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЗрд╕рдХреЗ GitHub repository рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред
рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рджреЗрдЦреЗрдВ
рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рднреА рдирд┐рд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВ:
chrome://version/
рдкрд░ рдЬрд╛рдХрд░ рдЕрдкрдиреЗ Chrome рд╕реНрдерд╛рдиреАрдп рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪреЗрдВ рдФрд░ "Profile Path" рдлрд╝реАрд▓реНрдб рдХреЛ рдЦреЛрдЬреЗрдВред- рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рднреАрддрд░
Extensions/
рдЙрдкрдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдБред - рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА рд╕реНрдерд╛рдкрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рдЙрдирдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкрдардиреАрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВред
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдирдХреЗ IDs рдХреЛ рдирд╛рдореЛрдВ рд╕реЗ рдореИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ ID рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП
about:extensions
рдкреГрд╖реНрда рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдореЛрдб рд╕рдХреНрд╖рдо рдХрд░реЗрдВред - рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рднреАрддрд░,
manifest.json
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдкрдардиреАрдпname
рдлрд╝реАрд▓реНрдб рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред
рдлрд╝рд╛рдЗрд▓ рдЖрд░реНрдХрд╛рдЗрд╡рд░ рдпрд╛ рдЕрдирдкреИрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
Chrome Web Store рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдлрд╝рд╛рдЗрд▓ рдХрд╛ .crx
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реЛрдЧрд╛ред рдлрд╝рд╛рдЗрд▓ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ .crx
рд╕реЗ .zip
рдореЗрдВ рдмрджрд▓реЗрдВред ZIP рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдЖрд░реНрдХрд╛рдЗрд╡рд░ (рдЬреИрд╕реЗ WinRAR, 7-Zip, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
Chrome рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
Chrome рдЦреЛрд▓реЗрдВ рдФрд░ chrome://extensions/
рдкрд░ рдЬрд╛рдПрдБред рд╢реАрд░реНрд╖ рджрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ "рдбреЗрд╡рд▓рдкрд░ рдореЛрдб" рд╕рдХреНрд╖рдо рдХрд░реЗрдВред "рд▓реЛрдб рдЕрдирдкреИрдХреНрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди..." рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЕрдкрдиреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдБред рдпрд╣ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдпрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
Chrome рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореИрдирд┐рдлреЗрд╕реНрдЯ рдбреЗрдЯрд╛рд╕реЗрдЯ
рдХрдордЬреЛрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк https://github.com/palant/chrome-extension-manifests-dataset рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрдордЬреЛрд░ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 25000 рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди, content_scripts
рдФрд░ рдЕрдиреБрдорддрд┐ nativeMessaing
рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
{% code overflow="wrap" %}
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
{% endcode %}
рд╕реБрд░рдХреНрд╖рд╛ рдСрдбрд┐рдЯ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реАрдорд┐рдд рд╣рдорд▓реЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдЦреНрддреА рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ:
- рдЕрдиреБрд░реЛрдз рдХреА рдЧрдИ
permissions
рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реАрдорд┐рдд рдХрд░реЗрдВ host_permissions
рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реАрдорд┐рдд рдХрд░реЗрдВ- рдПрдХ рдордЬрдмреВрдд
content_security_policy
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ externally_connectable
рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реАрдорд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рди рдЫреЛрдбрд╝реЗрдВ,{}
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ- рдпрджрд┐ рдпрд╣рд╛рдВ XSS рдпрд╛ рдЯреЗрдХрдУрд╡рд░ рдХреЗ рд▓рд┐рдП рдХрдордЬреЛрд░ URL рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реАрдзреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрд╛рдпрдкрд╛рд╕ред
web_accessible_resources
рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реАрдорд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЦрд╛рд▓реА рднреАред- рдпрджрд┐
web_accessible_resources
рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ ClickJacking рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ - рдпрджрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рд╡реЗрдм рдкреГрд╖реНрда рдореЗрдВ рдХреЛрдИ рд╕рдВрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ XSS рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ рдЬреЛ рд╕рдВрд╡рд╛рдж рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред
- рдпрджрд┐ рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреЛрд╕реНрдЯ рд╕рдВрджреЗрд╢ рдХрдордЬреЛрд░рд┐рдпреЛрдВ** рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВред**
- рдпрджрд┐ рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ DOM рд╡рд┐рд╡рд░рдг рддрдХ рдкрд╣реБрдВрдЪрддреА рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╡реЗ XSS рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рддреА рд╣реИрдВ рдпрджрд┐ рд╡реЗ рд╡реЗрдм рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ
- рдпрджрд┐ рдпрд╣ рд╕рдВрд╡рд╛рдж рдХрдВрдЯреЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ -> рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╡рд╛рдж рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖ рдЬреЛрд░ рджреЗрдВ
- рдпрджрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗрдЯрд┐рд╡ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░ рд░рд╣реА рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рдВрд╡рд╛рдж рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕реНрд╡рдЪреНрдЫ рд╣реИ
- рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
- рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
- рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЙрдкрдХрд░рдг
Tarnish
- рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХреНрд░реЛрдо рд╡реЗрдмрд╕реНрдЯреЛрд░ рд▓рд┐рдВрдХ рд╕реЗ рдХреЛрдИ рднреА рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЦреАрдВрдЪрддрд╛ рд╣реИред
- manifest.json рджрд░реНрд╢рдХ: рдмрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдореИрдирд┐рдлреЗрд╕реНрдЯ рдХрд╛ JSON-рдкреНрд░реЗрдЯрд┐рдлрд╛рдЗрдб рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг: web_accessible_resources рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдФрд░ рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯрд┐рдВрдЧ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд┐рд░реНрдорд╛рдгред
- рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд▓рд┐рдХрдЬреИрдХрд┐рдВрдЧ рд╡рд┐рд╢реНрд▓реЗрд╖рдг: рдПрдХреНрд╕рдЯреЗрдВрд╢рди HTML рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЬрд┐рдирдореЗрдВ web_accessible_resources рдирд┐рд░реНрджреЗрд╢ рд╕реЗрдЯ рд╣реИред рдпреЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд▓рд┐рдХрдЬреИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдордЬреЛрд░ рд╣реИрдВред
- рдЕрдиреБрдорддрд┐ рдЪреЗрддрд╛рд╡рдиреА рджрд░реНрд╢рдХ: рдЬреЛ рд╕рднреА рдХреНрд░реЛрдо рдЕрдиреБрдорддрд┐ рдкреНрд░реЙрдореНрдкреНрдЯ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред
- рдЦрддрд░рдирд╛рдХ рдлрд╝рдВрдХреНрд╢рди: рдЦрддрд░рдирд╛рдХ рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХрд╛ рд╕реНрдерд╛рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ, innerHTML, chrome.tabs.executeScript рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди)ред
- рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ: рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдмрд╛рд╣рд░реА рдЗрдирдкреБрдЯ рдХреЛ рдХрд╣рд╛рдВ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
- рдЦрддрд░рдирд╛рдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╕реНрдХреИрдирд░ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдЙрддреНрдкрдиреНрди рдЕрд▓рд░реНрдЯ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдФрд░ рд╡рд╣ рдкрдВрдХреНрддрд┐ рдЬрд┐рд╕рдиреЗ рдЕрд▓рд░реНрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред
- рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдгред
- рдХреЛрдб рд╡рд╛рд▓реЗ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП "View File" рдмрдЯрдиред
- рдЕрд▓рд░реНрдЯ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрдеред
- рдЕрд▓рд░реНрдЯ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреВрд░реНрдг рдХреНрд░реЛрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди URIред
- рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдкреГрд╖реНрда рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд╕рд╛рдордЧреНрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░рд┐рдпрд╛, рдЖрджрд┐ред
- рдпрджрд┐ рдХрдордЬреЛрд░ рдкрдВрдХреНрддрд┐ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ, рддреЛ рдпрд╣ рдЙрди рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рдкрде рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрди рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ web_accessible_resource рд╕реНрдерд┐рддрд┐ред
- рдХрдВрдЯреЗрдВрдЯ рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ (CSP) рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдФрд░ рдмрд╛рдпрдкрд╛рд╕ рдЪреЗрдХ: рдпрд╣ рдЖрдкрдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ CSP рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЗ CSP рдХреЛ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯреЗрдб CDNs рдЖрджрд┐ рдХреЗ рдХрд╛рд░рдг рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдЧрд╛ред
- рдЬреНрдЮрд╛рдд рдХрдордЬреЛрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп: рдпрд╣ рдЬреНрдЮрд╛рдд-рдХрдордЬреЛрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП Retire.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
- рдореВрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред
- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдПрдХ рд╕реБрдВрджрд░ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░реЗрдЯрд┐рдлрд╛рдЗрдб HTML рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ)ред
- рд╕реНрдХреИрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреИрд╢рд┐рдВрдЧ, рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реНрдХреИрди рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдкрд╣рд▓реЗ рдмрд╛рд░ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рджреВрд╕рд░реА рдмрд╛рд░, рдпрджрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреИрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдХрд╛рд░рдг рд▓рдЧрднрдЧ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛ред
- рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд░рд┐рдкреЛрд░реНрдЯ URLs, рдХрд┐рд╕реА рдФрд░ рдХреЛ tarnish рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред
Neto
рдкреНрд░реЛрдЬреЗрдХреНрдЯ Neto рдПрдХ Python 3 рдкреИрдХреЗрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ рдХреНрд░реЛрдо рдЬреИрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреА рдЫрд┐рдкреА рд╣реБрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдЕрдирд╛рд╡рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкреИрдХреЗрдЬ рдХрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирдЬрд╝рд┐рдк рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ manifest.json
, рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ HTML рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХреЗред
рд╕рдВрджрд░реНрдн
- рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @naivenom
- https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing
- https://palant.info/2022/08/10/anatomy-of-a-basic-extension/
- https://palant.info/2022/08/24/attack-surface-of-extension-pages/
- https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/
- https://help.passbolt.com/assets/files/PBL-02-report.pdf
- https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts
- https://developer.chrome.com/docs/extensions/mv2/background-pages
- https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/
- https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the ЁЯТм Discord group or the telegram group or follow us on Twitter ЁЯРж @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.