Motion DevTools

Motion DevTools

ID: mnbliiaiiflhmnndmoidhddombbmgcdk

Supported Languages

🇺🇸English

Extension Info & Metadata

Status
Active
Version
1.1.0
Size
0.77 MB
Rating
4.5/5
Reviews
8
Users
4,000
Type
Extension
Updated
Jun 8, 2023
Category
Developer tools
Price
Paid
Featured
Yes
Visibility
Listed
Mature
No
By Google
No
Trusted
Yes

Publisher Contextual Analysis

Trusted
Author
motion.devView Profile
Website
Visit
Total Extensions
1
Active
1
Obsolete
0
Listed
1
Unlisted
0
Total Users
4,000
Screenshot 1
Screenshot 2
Screenshot 3
Screenshot 4

Inspect, edit and export animations made with CSS and Motion One.

Motion DevTools is a browser extension to inspect, edit and export animations made with CSS and Motion One. 🔍 Inspect: Press record and interact. Detected CSS and Motion One animations will be plotted on a classic timeline interface. Use the playback controls to scrub through and replay your animation from any point. ✍️ Edit: Add, move and remove keyframes. Edit values and easing with custom controls, and your edits will be reflected on the page in real-time. 🚢 Export: Perfected your animation? Hit the export button to instantly generate code. Export any animation into CSS transitions, CSS animations or Motion One.

Item
Type
Severity
Description
http://*/*
Host
Critical
Broad host access — the extension can read/modify content on every website.
https://*/*
Host
Critical
Broad host access — the extension can read/modify content on every website.
webNavigation
Permission
High
This permission enables monitoring of all browser navigation events and transitions. Rated High because it can track every page visit, navigation method, and browsing pattern, potentially exposing sensitive browsing behavior and user activities.
Contextual Risk Factors
Risk Factor
High
The following context increases the overall risk:• 10% increase: Early script execution enables pre-emptive content manipulation
Broad Host Permissions
Risk Factor
High
This extension has broad host permissions allowing it to access many or all websites.
storage
Permission
Medium
This permission allows storing data locally in the browser. Rated Medium because it can persist sensitive user data, track user activities over time, and potentially store malicious payloads.
file:///*
Host
Medium
Host permission — access limited to this URL pattern.
Early Content Script Execution
Risk Factor
Medium
This extension runs content scripts at document_start.

The extension registers an `onMessageExternal` listener that accepts login payloads (username, email, isPro) from any page whose URL contains the string "motion.dev" — this substring check is insufficient and could be spoofed with a domain like `evil-motion.dev` or a path such as `attacker.com/motion.dev/`. A successful spoof would allow an attacker to overwrite the stored user credentials in `chrome.storage.sync`.

js/background.js (Line 217)
const handleLogin = (message, sender, sendResponse) => {  // Only accept messages from motion.dev  if (!sender.url || !sender.url.includes("motion.dev"))    return;  switch (message.type) {    case "login": {      const {        username,        email,        isPro      } = message;      chrome.storage.sync.set({        user: {          username,          isPro,          email,          verifiedAt: new Date()            .getTime(),          numRetryAttempts: 0,        },      }, () => sendResponse({        success: true      }));      break;    }  }};chrome.runtime.onMessageExternal.addListener(handleLogin);

The content script runs at `document_start` across all URLs and all frames (`<all_urls>`, `all_frames: true`) and immediately injects `client.js` into the page's main world JavaScript context by appending a `<script>` element. This gives extension-controlled code full access to the page's DOM, JavaScript heap, and any secrets (tokens, form data) present on every website the user visits before the page has loaded any of its own content.

js/bridge.js (Line 1)
(function() {    'use strict';    var _a;    window.__MOTION_BRIDGE_HAS_LOADED = true;    /**     * Inject client script into the actual webpage     */    const script = document.createElement("script");    script.src = chrome.runtime.getURL("js/client.js");    document.documentElement.appendChild(script);    (_a = script.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(script);

User email and username are transmitted to `https://motion.dev/api/pro/check-subscription` as plaintext URL query parameters on every periodic auth check. Embedding PII in query strings exposes the data in server access logs, browser history, and any intermediate proxies or CDN logs, making it a persistent privacy leak beyond the immediate HTTPS channel.

js/background.js (Line 52)
function checkAuth() {  return __awaiter(this, void 0, void 0, function*() {        const {          user        } = yield chrome.storage.sync.get("user");        if (!user || new Date()          .getTime() - user.verifiedAt < weekMs)          return;        try {          const response = yield fetch(            `https://motion.dev/api/pro/check-subscription?username=${user.username}&email=${user.email}`);          const {            result          } = yield response.json();          if (result) {            chrome.storage.sync.set({              user: Object.assign(Object.assign({}, user), {                verifiedAt: new Date()                  .getTime(),                numRetryAttempts: 0              }),            });          } else {            chrome.storage.sync.remove("user");          }

The bridge listens for all `window.postMessage` events from the current page and forwards any message with type `login` to the background service worker without validating the page origin. Any script running on the visited page (including third-party scripts and XSS payloads) can craft a `{type: 'login', username: ..., email: ...}` message and have it relayed to the background, potentially overwriting the stored user object in `chrome.storage.sync`.

js/bridge.js (Line 51)
const handleMessagesFromWebPage = (event) => {  if (event.source != window)    return;  if (!backgroundPort) {    connect();  }  switch (event.data.type) {    /**     * Events from client to backend     */    case "animationstart":    case "clientready":    case "login": {      backgroundPort.postMessage(event.data);      return;    }  }};window.addEventListener("message", handleMessagesFromWebPage, false);

The `externally_connectable` manifest entry permits any page served from localhost on any port and any protocol (http or https) to send messages directly to the extension via `chrome.runtime.sendMessage`. Because the background's `handleLogin` guard only checks whether `sender.url` contains the string `motion.dev`, a localhost dev server (or local malware) can also send a `login` message if it includes `motion.dev` anywhere in its URL structure, allowing arbitrary credential injection into the extension's storage.

manifest.json (Line 43)
{  "externally_connectable": {    "matches": [      "https://*.motion.dev/*",      "*://localhost/*"    ]  }}

By severity

Critical0
High2
Medium3
Low0

Versions scanned

Showing 1 of 6 scanned versions with more than one unique finding. Counts are unique findings that include each version.

Extension VersionCode Review Findings
1.1.05

Files with findings

3 distinct paths — top paths by unique finding count:

  • js/background.js2
  • js/bridge.js2
  • manifest.json1
S.No.
Category
Severity
File
Summary
Found in Version
1Code Injection
high
js/bridge.js (line 1)The content script runs at `document_start` across all URLs and all frames (`<all_urls>`, `all_frames: true`) and immediately injects `client.js` into the page's main world JavaScript context by appending a `<script>`…
2Privilege Escalation
high
js/background.js (line 217)The extension registers an `onMessageExternal` listener that accepts login payloads (username, email, isPro) from any page whose URL contains the string "motion.dev" — this substring check is insufficient and could be…
3Data Exfiltration
medium
js/background.js (line 52)User email and username are transmitted to `https://motion.dev/api/pro/check-subscription` as plaintext URL query parameters on every periodic auth check. Embedding PII in query strings exposes the data in server acce…
4Privilege Escalation
medium
manifest.json (line 43)The `externally_connectable` manifest entry permits any page served from localhost on any port and any protocol (http or https) to send messages directly to the extension via `chrome.runtime.sendMessage`. Because the …
5Unauthorized Data Collection
medium
js/bridge.js (line 51)The bridge listens for all `window.postMessage` events from the current page and forwards any message with type `login` to the background service worker without validating the page origin. Any script running on the vi…
URLs
127
IPv4
0
IPv6
0

URLs

View the external URLs this extension communicates with to understand its network activity and data interactions.

Gain full insight into all external connections.

Upgrade for full visibility.

bugs.chromium.org/p/v8/issues/detailhttps://bugs.chromium.org/p/v8/issues/detail?id=4118
bugs.chromium.org/p/v8/issues/detailhttps://bugs.chromium.org/p/v8/issues/detail?id=3056
reactjs.org/docs/error-decoder.htmlhttps://reactjs.org/docs/error-decoder.html?invariant=
github.com/uuidjs/uuidhttps://github.com/uuidjs/uuid#getrandomvalues-not-supported
github.com/uuidjs/uuid/pull/434https://github.com/uuidjs/uuid/pull/434
github.com/gre/bezier-easing/blob/master/src/index.jshttps://github.com/gre/bezier-easing/blob/master/src/index.js
github.com/gre/bezier-easing/blob/master/LICENSEhttps://github.com/gre/bezier-easing/blob/master/LICENSE
trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpphttps://trac.webkit.org/browser/webkit/trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp?rev=281238#L1099
motion.dev/api/pro/check-subscriptionhttps://motion.dev/api/pro/check-subscription?username=${user.username}&email=${user.email}`
reactjs.org/link/react-polyfillshttps://reactjs.org/link/react-polyfills
Showing 1 to 10 of 130 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

No IP addresses found
Showing 1 to 6 of 10 rows
Rows per page:

Code Diff

Compare extension code between any two versions.

0 changed files (scanned top 25 shared text files)

No comparable text files found between these versions.

Browse and explore files within this extension package

Gain full insight into all external connections.

Upgrade for full visibility.