Is Kendo-Linkedin Email Finder safe?

Medium risk

Kendo-Linkedin Email Finder auto-pages LinkedIn search results and uploads every listed member's profile data to its own server.

When the user clicks "Build Email List," the extension repeatedly pages through LinkedIn or Sales Navigator search results, pulling each visible member's name, LinkedIn ID, profile URL, title, company and location from LinkedIn's own page data. It batches this data and sends it to kendoemailapp.com, which returns matched emails and phone numbers billed against the user's purchased credits. Between pages the extension waits a randomized interval and fires synthetic mouse-move events timed to mimic normal browsing before clicking to the next page.

kendov2.0.271Firefox Add-ons
45Risk
Who publishes it

kendo - no other listings under this identity, 5 shared hostnames

What this publisher told the store about itself, and the other listings that told it the same thing.

Publisher
kendo

Shared hosts - 5 hostnames

Hostnames hardcoded in this extension that few other listings call. That can mean one operator behind both, and it can equally mean a small shared vendor, so it is context rather than a conclusion. Hosts that many listings call are left out: they are services, not connections.

adorito.com
Also called by 1 other listing: Kendo-Email Finder
app.bizboom.io
Also called by 1 other listing: Kendo-Email Finder
bizboom.io
Also called by 1 other listing: Kendo-Email Finder
hunter.prospectingrobot.com
Also called by 1 other listing: Kendo-Email Finder
kendoemailapp.com
Also called by 4 other listings, including Kendo Sourcing Ninja

AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.

Publishers can request a review.

Findings

SeverityHIGH
ClassUNWANTED
TypeUnexpected
CWECWE-359
SourceAI FOUND

Kendo Email Finder auto-scrapes LinkedIn search results and evades bot checks

Code analysis shows Kendo Email Finder auto-paginates LinkedIn/Sales Navigator results, scraping each member's ID, name, URL, title, company, location, then uploads batches to kendoemailapp.com timing mouse moves to evade bot detection.

01EvidenceCAUSE EFFECT
What actually happens
You did this

You click the extension's 'BUILD EMAIL LIST' button on a LinkedIn or Sales Navigator people-search results page.

The extension did this

The extension repeatedly scrapes every visible search result, auto-advances to the next results page, and uploads each batch to the vendor's backend.

This continues unattended until pagination runs out or you click 'STOP PROCESS'.

02EvidenceFIELD TABLE
Fields pulled from each third-party member's search-result entry
FieldValueWhy it matters
LinkedIn member ID
554382190The numeric ID LinkedIn assigns internally to that person's account.
Full name
Priya ShahThe member's displayed name.
Profile URL
priya-shah-9b21The member's public LinkedIn profile slug.
Headline/title
VP of MarketingTheir current job title as shown in the search result.
Company
Acme CorpTheir current employer as shown in the search result.
Location
San Francisco Bay AreaTheir listed geographic region.
03EvidenceTEMPORAL PATTERN
When this fires
Every 1 minute

Between pages, the extension waits 60-95 seconds (30-45s on the 8th cycle, 200-230s on the 24th) while dispatching a synthetic mousemove event once a second, then auto-clicks the next-page control at the 5-second mark.

04EvidenceCODE COMPARE
The code that does this

content.js: the wait/evade/auto-paginate loop that runs after each scraped batch

What it actually does
loadSearchEmails3(mbrList2, (result) => {
    if (result) {
        CTACredit = result.credit;
        var found = sessionStorage.getItem("loadingfound") ? parseInt(sessionStorage.getItem("loadingfound")) : 0;
        found += result.found;
        sessionStorage.setItem(`loadingfound`, found.toString());
        $(`#${widgetConfig.whid}twit2`).html(`Moving to next page<br>Credit:${CTACredit} / Found:${found}<br>Please wait`);
        if ((mbrList2.length > 9 || $(".search-result__wrapper").length > 9 ||
            $(".reusable-search__result-container").length > 9 ||
            $(".search-results__result-list").length > 24) && !stopLoadSearchEmails) {
            var randWait = Math.floor(Math.random() * 35 + 60);
            var cnt = parseInt(sessionStorage.getItem("loadingcnt"));
            if (!cnt)
                cnt = 1;
            else
                cnt++;
            sessionStorage.setItem("loadingcnt", cnt.toString());
            if (cnt % 8 == 7)
                randWait = 30 + Math.floor(Math.random() * 15);
            if (cnt % 24 == 20)
                randWait = 200 + Math.floor(Math.random() * 30);
            sessionStorage.setItem("loadingdt", "start");
            const its = setInterval(() => {
                randWait--;
                if (randWait > 0 && !stopLoadSearchEmails) {
                    const event = $.Event("mousemove");
                    event.pageX = 100;
                    event.pageY = Math.random() * 1000;
                    $(document).trigger(event);
                    $(`#${widgetConfig.whid}twit2`).html(`Waiting ${randWait} seconds<br>Credit: ${CTACredit} / Found: ${found}<br>Please wait`);
                    if (randWait == 5) {
                        //linkedin
                        if ($(".artdeco-pagination__button--next,.next").length > 0 || $(".artdeco-pagination__button--previous,.prev").length > 0) {
                            if ($(".artdeco-pagination__button--next,.next").length > 0)
                                $(".artdeco-pagination__button--next,.next").click();
                            else
                                StopSearchEmails(true);
                        }
                        //sales nav
                        if ($(".search-results__pagination-next-button").length > 0) {
                            if ($(".search-results__pagination-next-button").prop("disabled"))
                                StopSearchEmails(true);
                            else
                                $(".search-results__pagination-next-button").click();
                        }
                    }
                }
                else {
                    clearInterval(its);
                }
            }, 1000);
            return setTimeout(() => {
                if (!stopLoadSearchEmails) {
                    $(`#${widgetConfig.whid}twit2`).html(`Moving to next page <br>Credit:${CTACredit} / Found:${found}<br>Please wait`);
                    $("html, body").animate({ scrollTop: 4000 }, Math.random() * 5000 + 2000).promise().then(() => {
                        location.reload();
                    });
                }
            }, (randWait + 1) * 1000);
        }
    }
    StopSearchEmails(true);
});
05EvidenceTHIRD PARTY LIST
Where the scraped batches go
  • kendoemailapp.com

    The extension vendor's own backend for its paid 'email finder' product; receives each scraped batch and returns matched emails/phone numbers against the account's credit balance.

06EvidencePLAIN NOTE
Observation

Static analysis finding. This behaviour was identified by reading the shipped extension code and has not yet been reproduced in a live run. The trigger conditions and the exact data sent are read from the code, not from an observed capture.

What it can do

Permissions this extension asks for, as declared in version 2.0.271. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.

  • Read and change your data on www.linkedin.com

    https://www.linkedin.com/*

  • Read and change your data on kendoemailapp.com

    https://kendoemailapp.com/*

  • Store data in your browser

    storage

  • Keep running in the background while your browser is open

    background

Where it sends data

Destinations our analysis observed Kendo-Linkedin Email Finder contacting. Sending data somewhere is not a finding on its own - an extension that syncs your settings has to talk to its own server - but it is where your data can go, and who else it goes to.

  • kendoemailapp.com

    Kendo-Linkedin Email Finder sends data to kendoemailapp.com. No other extension we have analysed sends data here.

Updated 30 September 2026amo-2616526