Security Testing Services in India
We run security testing from India for the CTOs, founders and engineering managers leading teams across the US, UK, Canada, Australia and New Zealand, covering SAST, DAST, dependency, secrets and authorisation testing that engineers act on instead of muting. We tune the scanners, write the authorisation tests nobody automates, and put the right checks in the pull request and the rest at the release gate.
Why Does Your Scanner Report Four Thousand Findings and Nobody Fixes Any of Them?
This is the state most teams are actually in. Somebody bought a scanner, or turned on the free one in the code host, and it produced a number so large that the number itself became the problem. Nobody triaged it, because triaging four thousand findings is a month of work with no visible output. So a rule got added to the pipeline that reports but never blocks, and eighteen months later the dashboard is red, everyone has learned to ignore it, and the one genuine SQL injection in there has been sitting at position 2,847 the whole time.
The failure is not the tool. It is that the tool was installed with its default rule set against a codebase it knew nothing about, and then nobody owned the output. A default SAST configuration will flag every string concatenation that looks vaguely like a query, every use of a random number generator whether or not it is used for anything security-relevant, and every deserialisation call regardless of whether the input is attacker-controlled. On a mature codebase that is thousands of findings before you have written a line of new code.
There is a second failure underneath it, and it is quieter. Scanners are very good at the classes of bug that look wrong in the source: a query built by concatenation, an unescaped template variable, a dependency with a known CVE. They are close to useless at the classes of bug where the code is perfectly correct and the logic is wrong. If your API returns invoice 4471 to anybody who asks for invoice 4471, no static analyser on earth will tell you that user B should not have been able to read user A's invoice. That is the bug that ends up in the breach notification, and it is the one your tooling is silent about.
So the job is rarely to add another scanner. It is to make the ones you have produce a short list somebody will actually work through, and then to cover by hand the parts they structurally cannot see. That is what this page is about.
One framing that helps before the detail starts. Security testing is not a phase you pass and finish. It is a set of feedback loops with different speeds: a secret caught before it ever leaves a laptop, a vulnerable dependency caught the morning after it is published, an authorisation gap caught by a test that runs on every merge, and a design flaw caught in a whiteboard conversation before the code exists at all. Getting the speed right for each loop is most of the skill.
SAST, DAST, IAST and SCA: What Each One Genuinely Catches
These four acronyms get sold as if they were competing products. They are not. They look at different things, at different times, and each is blind in a way the others are not. Buying one and calling it security testing is how teams end up confident and exposed at the same time.
SAST: reading the code without running it
Static application security testing parses your source and follows data from where it enters the program to where it does something dangerous. Semgrep, CodeQL, SonarQube and Checkmarx all work on this principle, as do the language-specific tools: Bandit for Python, gosec for Go, Brakeman for Rails, find-sec-bugs for Java.
What it genuinely catches: injection built by string concatenation, unsafe deserialisation, hardcoded credentials, weak cryptographic primitives, path traversal, and the long tail of framework misuse where a supposedly safe API is called in an unsafe mode. Where it is strong, it is very strong, because it sees every path including the ones nobody exercises in testing.
What it misses: anything that depends on runtime state or configuration. It does not know your reverse proxy strips a header, that your ORM parameterises the query it is worried about, or that the endpoint it flagged is behind an authentication middleware. It also has no concept of who is allowed to do what. The false positive rate is the price of seeing every path, and it is the single reason SAST gets switched off.
The practical trade-off is speed against depth. Semgrep runs on a diff in seconds and is easy to write custom rules for, which makes it the right tool in a pull request. CodeQL does deeper interprocedural analysis and is correspondingly slower, which makes it the right tool nightly or on merge. Running the deep tool on every push is a common and self-defeating choice.
DAST: attacking the running application
Dynamic testing throws requests at a deployed instance and looks at what comes back. OWASP ZAP and Burp Suite are the tools most teams end up with, with Nuclei increasingly used for templated checks against known issues.
What it genuinely catches: things that only exist once the system is assembled. Missing security headers, TLS misconfiguration, cookies without the Secure or HttpOnly flags, verbose error pages leaking stack traces, directory listing left enabled, an admin panel reachable from the internet, reflected cross-site scripting that survives your actual template layer.
What it misses: everything it cannot reach. An unauthenticated DAST scan of an application where ninety percent of the surface is behind a login is testing the login page. This is the most common way DAST is wasted, and fixing it is unglamorous work: supply the scanner with valid sessions, teach it how to re-authenticate when it logs itself out by hitting the sign-out link, and exclude the destructive endpoints so it does not empty your staging database halfway through.
Single-page applications make this harder again. A crawler that only follows anchor tags will find almost nothing in a React or Vue front end, so the scan has to be driven from the API contract instead. If you have an OpenAPI specification, that becomes the map, which is one of several reasons a stale specification is a security problem rather than a documentation one.
IAST: instrumenting the application while it is tested
Interactive testing puts an agent inside the running application, usually as a language runtime hook, and watches what actually happens while your existing functional tests exercise it. Contrast Security and Seeker are the usual commercial names.
The appeal is real: because the agent sees the concrete data flow at runtime, it can tell you that this specific request reached this specific sink with attacker-controlled input, which cuts the false positive rate hard compared with pure static analysis. It also reports the line of code, which DAST cannot.
Where it is wrong: IAST only sees the code your tests exercise, so its coverage is exactly your functional test coverage and no better. If your integration suite touches sixty percent of routes, forty percent of the application is invisible to it. It also needs an agent in the runtime, which some teams will not accept in any environment they care about, and it is limited to the languages the vendor supports. We recommend it when there is a strong existing test suite to piggyback on and licence budget exists. We do not recommend it as a first purchase.
SCA: the code you did not write
Software composition analysis resolves your dependency tree and compares it against vulnerability databases. OWASP Dependency-Check, OSV-Scanner, Grype, Trivy and Snyk all do a version of this, and Dependabot or Renovate handle the upgrade side.
What it genuinely catches: known vulnerabilities in known versions, including in transitive dependencies you never chose. Given that most modern applications are mostly other people's code, this is usually where the largest raw finding count lives.
What it misses: anything not yet in a database, anything in a vendored or copy-pasted library that no manifest records, and the whole question of whether the vulnerable function is ever called. A critical CVE in a code path your application never reaches is not a critical risk to you, and treating it as one is how teams burn a sprint on upgrades that change nothing. Reachability analysis, where the tool checks whether the vulnerable symbol appears in your call graph, is the feature worth paying for here.
What none of them catch
Business logic. All four tools are looking for patterns, and a logic flaw has no pattern. A discount code that can be applied twice, a refund flow that can be triggered after the goods have shipped, a rate limit on the login endpoint but not on the password reset endpoint, an object identifier that can be incremented. These are found by a person who understands what the application is for, reading the code and probing the running system with intent. That is why the tooling and the human work are complementary, and why a page selling you scanners as complete coverage is selling you something false.
The False Positive Problem, and How to Stop a Scanner Being Ignored
Every security tool has a credibility budget. Each finding that turns out to be nothing spends some of it. Once the budget is gone the tool is dead, regardless of whether it is still running, because engineers have learned that the fastest way to a green build is to add a suppression comment without reading the finding. Getting that budget back is harder than earning it in the first place, so the tuning work matters more than the tool choice.
Baseline first, so new code is held to a standard old code is not
The single most effective move on an existing codebase is to freeze what is already there. Semgrep does this with a baseline commit, and most tools have an equivalent. Everything currently reported becomes accepted debt, tracked separately, and the gate applies only to code changed after that point. The effect on behaviour is immediate: a developer opening a pull request sees two findings that are theirs, not four thousand that are not, and two findings get fixed.
The existing backlog does not disappear. It gets worked down deliberately, ranked by exploitability, in a separate stream with its own budget. Mixing the two streams is what makes both fail.
Tune the rules against your actual frameworks
Generic rule packs assume a generic application. Yours uses a specific ORM, a specific template engine, a specific authentication middleware. Most of the noise comes from a handful of rules that do not understand those, and turning off the worst five or six rules typically removes a large share of the volume without losing anything real. Where a rule is right in principle but wrong in your context, the better fix is a custom rule that encodes your safe pattern, so the check stays and the noise goes.
Custom rules are also where the value compounds. If your codebase has an internal helper that must always be used for outbound HTTP because it enforces an allowlist, a five line Semgrep rule that fails any direct client construction is worth more than the entire generic ruleset, because it encodes a decision your team already made and keeps forgetting.
Rank by exploitability, not by severity label
CVSS scores what a vulnerability could do in the abstract. It has no idea whether anybody is exploiting it, or whether your deployment is even affected. Two public data sources fix most of that gap. EPSS estimates the probability that a given CVE will be exploited in the wild in the near term, and the CISA Known Exploited Vulnerabilities catalogue lists what is confirmed to be under active attack. A medium CVSS finding on the KEV list outranks a critical that nobody has ever exploited, every time.
Layer your own context on top: is the component reachable from untrusted input, is the service internet-facing, does it hold personal data. A vulnerability in an internal batch job that reads from a queue you control is a different problem from the same vulnerability in your public API, and treating them identically is how the queue never gets fixed either.
Suppressions with an owner and an expiry
Suppression is legitimate. Permanent, anonymous, unexplained suppression is not. Every suppression carries a reason, a named owner and a date after which it fails again. That single rule changes the character of the mechanism: it stops being a way to make the build green forever and becomes a way to defer a decision you have consciously made. We report on the suppression list at the same cadence as the findings list, because a growing suppression file is exactly as informative as a growing backlog.
Somebody owns triage, in writing
Findings that belong to everybody belong to nobody. Triage needs a named rotation, a defined response time by severity band, and a decision recorded for every finding: fix now, fix in this sprint, accept with an expiry, or false positive with a rule change so it never fires again. That last one matters most. If the answer to a false positive is a suppression rather than a rule fix, you will make the same decision again in six weeks, and so will everyone else.
Dependencies, Transitive Risk and the Supply Chain
Most of what runs in production was written by people you have never met. A modest Node service can pull in several hundred packages once the tree is resolved, and you chose perhaps fifteen of them. Everything else arrived because something you chose depended on it. That is the actual attack surface, and it behaves differently from your own code.
Direct and transitive are different problems
A vulnerability in a direct dependency is usually straightforward: upgrade it, run the tests, ship. A vulnerability three levels down is not, because you cannot upgrade it directly. You need whichever intermediate package pins it to release a version that moves the pin, and that maintainer may be unresponsive, or the fix may be in a major version that breaks the intermediate's API.
The escape hatches exist and each has a cost. npm overrides, Yarn resolutions, Maven dependency management and Go's replace directive all let you force a version, which works right up until the intermediate package genuinely depended on the old behaviour. Forcing a transitive version without testing the intermediate is a way to convert a security finding into a production incident, so we treat every override as a change that needs its own verification rather than a one line fix.
Lockfiles, and the reproducibility question
If your build resolves versions fresh each time, you do not know what you shipped, which means you cannot answer what you shipped when a CVE lands. Committed lockfiles, verified integrity hashes and a build that fails rather than silently resolving a new version are the baseline. The check we run first on any new codebase is whether two builds of the same commit produce the same dependency set. Often they do not, and that is the finding to fix before any scanning is worth doing.
SBOM: generate it at build time, not afterwards
A software bill of materials is a machine-readable inventory of what went into a build, in CycloneDX or SPDX format. Syft and Trivy will generate one; most build tools now can too. The important detail is when: an SBOM generated from the build itself reflects what actually got compiled and packaged, while one reconstructed later from a manifest reflects what somebody thinks was there.
Store it with the release artifact and keep the history. The payoff arrives on the day a widely used component turns out to be vulnerable and your customers, your auditor or your board all ask the same question within an hour. Teams with queryable SBOMs answer in minutes. Teams without spend the first day of the incident working out what they run.
Provenance and signing
Knowing what is in the artifact is half the question. The other half is whether the artifact came from your build at all. Sigstore and cosign make signing build outputs practical without running your own key infrastructure, in-toto attestations record how the artifact was produced, and the SLSA framework gives you a graded ladder for how much of that you have actually achieved. Most teams we work with start at the bottom of that ladder, and the first two rungs, a scripted build and generated provenance, deliver most of the value.
This connects directly to your build system, which is why supply-chain hardening usually lands as a joint piece of work with pipeline changes. If your CI/CD pipeline rebuilds the artifact between staging and production, signing it is theatre, because the thing you signed is not the thing you shipped.
Typosquatting, dependency confusion and the human layer
Package registries are open by design, and that has been exploited in ways worth knowing about. Typosquatting registers a name one character away from a popular package and waits for a typo. Dependency confusion, published as a research technique in 2021 and widely reproduced since, exploits build tools that check a public registry before a private one, so an attacker publishes a package with your internal name at a higher version number and your build fetches theirs.
Compromise of legitimate packages has also happened repeatedly, through maintainer account takeover and through a maintainer handing a popular package to a stranger who turned out to have a plan. The xz-utils backdoor discovered in 2024 was the sharpest recent example of how patient that kind of attack can be.
The defences are mundane and effective. Scope private packages so an internal name cannot be resolved from a public registry. Pin the registry per scope rather than trusting resolution order. Require review on any new dependency addition, with a check on age, maintainer count and download history, not just licence. Disable install scripts where the ecosystem allows it. And keep the dependency count under some conscious control, because every package added is a maintainer you are trusting.
Secrets in Code, and What Actually Happens After a Leak
Credentials end up in repositories constantly, and almost never maliciously. Somebody hardcodes a key to test something locally, then commits the whole directory. A config file with real values gets checked in because the sample file was missing. A CI job prints an environment variable while somebody is debugging and the log is public. This is a process problem wearing a technical costume.
Three places to look, and they are not the same place
Pre-commit scanning stops a secret before it exists in history. Gitleaks and detect-secrets both work here, and this is the only layer that genuinely prevents the problem rather than reporting it. It is also the layer developers disable when it is slow or noisy, so it has to be fast and tuned.
History scanning finds what is already committed, including in branches nobody looks at and commits that were later reverted. Reverting a commit does not remove the secret; it just adds another commit. TruffleHog and Gitleaks both scan full history, and TruffleHog's verification step, which actively tests whether a discovered credential still works, is the difference between a list of maybes and a prioritised list of live exposures.
Runtime and log scanning catches the third category: secrets that are not in the source but end up in CI logs, container image layers, build artifacts or error reports sent to a third-party service. Container images deserve a specific mention because a secret deleted in a later layer is still present in the earlier one, and anybody who pulls the image can read it.
The rotation order, which people get backwards
When a live credential is found in a repository, the instinct is to rewrite history and make it go away. That is the wrong first move. Assume the credential is compromised the moment it reached a remote, because clones, forks, CI caches, code search indexes and mirrors all hold copies that a history rewrite will never touch.
So: revoke the credential first. Issue a replacement and deploy it. Pull the audit logs for the exposure window and look for use from unexpected addresses or at unexpected times. Then, if you still want to, rewrite history with git-filter-repo or BFG, understanding that it rewrites every commit hash and every open branch and pull request downstream of it, which is a coordination exercise across your whole team.
The uncomfortable version of this conversation is when the credential is a database password shared by six services and rotating it means a coordinated restart. That is not a security problem, it is an architecture problem that a security finding has exposed, and it usually needs a short piece of work to move to per-service credentials before rotation is even safe.
Stop needing the secret in the first place
The durable fix is fewer long-lived credentials. Federated identity between your build system and your cloud provider removes stored cloud keys entirely: the job exchanges a short-lived signed token for a scoped role at runtime and nothing durable sits anywhere. Application secrets come from a secret manager at deploy or run time. Anything that genuinely must persist gets an owner, a rotation schedule and an alert when it has not been rotated.
Push protection at the code host is worth turning on regardless, because it catches the case where somebody has bypassed the local hook. It is a backstop, not a strategy, and it only recognises credential formats it knows about, so your own internal token formats need a custom pattern.
Authentication and Authorisation Testing, Including IDOR and BOLA
Almost nobody automates this part, and it is where the expensive incidents live. Broken access control sits at the top of the OWASP Top 10 for a reason: it is common, it is easy to exploit, and it is invisible to pattern-matching tools because the vulnerable request is perfectly well formed.
Why scanners are structurally blind here
Consider an endpoint that returns an order by identifier. The code fetches the order and returns it. There is no injection, no unsafe deserialisation, no missing header. The only thing wrong is that it never checked whether the authenticated caller owns that order. A static analyser sees a database read and a response. A dynamic scanner with one session sees a valid 200. Nothing in the request or the code says anything is wrong, because whether it is wrong depends entirely on your business rules.
The API Security Top 10 splits this into distinct failures that are worth separating, because the fixes differ. Broken object level authorisation is the one above: the caller reaches an object they do not own. Broken function level authorisation is when a standard user reaches an administrative operation, usually because the check is in the user interface rather than the API. Broken object property level authorisation is subtler: the caller is allowed the object but should not be able to read or write one of its fields, which is how mass assignment turns a profile update into a privilege escalation by including a role field the front end never sends.
How we actually test it
The method is dull and it works. Build a matrix of roles against resources and operations, drawn from how the product is meant to behave rather than from the code, because deriving expected behaviour from the implementation just re-encodes the bug. Then create real accounts at each role level, capture real object identifiers belonging to each, and drive requests that cross the boundaries: user A's token against user B's identifiers, a standard user against administrative routes, a tenant against another tenant's data.
What you assert matters. A 404 and a 403 are both acceptable outcomes, but silence is not, and a 200 with an empty body is a bug waiting to become a leak. We also check the negative direction, that legitimate access still works, because an authorisation fix that quietly breaks a real user path is how these changes get reverted.
These checks then live in your test suite and run on every merge. That is the point. A one-off audit tells you the state of the system on a Tuesday; a suite of authorisation tests tells you the state of the system forever, and catches the regression when somebody refactors the middleware in nine months.
The authentication layer itself
Separate from authorisation, the identity layer has its own checklist. Whether tokens are actually validated rather than merely decoded, which is a real and recurring bug. Whether the signing algorithm is pinned so a token cannot be presented with the algorithm set to none. Whether expiry is enforced server-side. Whether logout invalidates anything or only clears a cookie. Whether password reset tokens are single use, time limited and unguessable. Whether rate limiting exists on the reset and multi-factor endpoints and not only on login, which is the gap attackers go to first.
Multi-tenant systems deserve their own pass, because tenant isolation is authorisation with a much worse blast radius. The specific thing to test is whether isolation is enforced in one place at the data access layer or reimplemented in every query, since the second pattern fails the moment somebody writes a new query and forgets.
OWASP Top 10 and API Security Top 10 as a Working Checklist
Both lists get used as marketing badges, which is a waste of a genuinely useful artefact. A claim of OWASP Top 10 coverage means very little on its own, because the categories are broad enough that a single trivial check could be said to touch one. Used properly, they are a coverage map: for each category, what tests exist, what tool runs them, when, and what is deliberately not covered.
The web Top 10 covers broken access control, cryptographic failures, injection, insecure design, security misconfiguration, vulnerable and outdated components, identification and authentication failures, software and data integrity failures, security logging and monitoring failures, and server-side request forgery. Note how uneven they are in how testable they are. Injection is largely automatable. Insecure design is a threat modelling exercise and no tool will help you. Logging and monitoring failures are found by asking whether an attack would have been visible in your logs at all, which is a question for a person with your log platform open.
The API Security Top 10 matters separately because APIs fail in ways web applications historically did not. Two categories in it are worth calling out because they are so often missed. Unrestricted access to sensitive business flows covers abuse that involves no technical vulnerability at all, such as automating a limited-stock purchase flow or a signup bonus. Improper inventory management covers the old version of your API still running on a subdomain nobody remembers, patched to a standard from three years ago. That second one is found by asking your infrastructure what is listening rather than by scanning what you think you deployed.
Where a stronger structure is needed, OWASP ASVS gives you graded requirements at three levels rather than ten themes, and it is a better fit when somebody has to sign something. Level 1 is the baseline any internet-facing application should meet, level 2 suits applications handling personal or financial data, and level 3 is for systems where a failure is severe. Picking a level and testing against it produces a defensible position. Claiming a Top 10 badge does not. Our deliverable is the filled-in map with the gaps visible, including the ones we did not close, because a coverage document that shows no gaps is a document nobody checked.
Threat Modelling: The Cheapest Step, Done Too Late
A whiteboard session costs a couple of hours. Finding the same flaw after it has shipped costs a release, a migration and sometimes a disclosure. Yet threat modelling is usually the step teams skip, because it produces no artefact that looks like progress and because the formal versions of it are heavy enough to put anyone off.
The lightweight version is four questions, and they are enough for most teams: what are we building, what can go wrong, what are we going to do about it, and did we do a good enough job. Run against a data flow diagram that fits on one page, with the trust boundaries drawn in, that conversation reliably surfaces things no scanner would ever have found. The most common finding in our experience is not an exotic attack. It is a trust boundary that turns out not to exist, an internal service that assumed its callers were trustworthy and is in fact reachable from a path nobody had traced.
STRIDE gives you prompts when the conversation stalls: spoofing, tampering, repudiation, information disclosure, denial of service, elevation of privilege, applied element by element to the diagram. Where privacy obligations are in play, LINDDUN covers the same ground with privacy-specific prompts such as linkability and identifiability, which surfaces different findings entirely. Use them as prompts, not as a form to complete. The moment the output is a spreadsheet nobody reads, the exercise has failed.
Timing is the whole point. Threat model at design time for a new system, when the answer can still be a different architecture. After that, model at the moments when the shape changes: a new integration, a new trust boundary, a new class of data, a change of authentication provider. Rerunning the whole exercise quarterly on a stable system produces the same document and teaches everyone that it is a ritual. The output that we hand over is short: the diagram, the trust boundaries, the ranked list of what could go wrong, and for each item either a mitigation, a test that would catch it, or an explicit decision to accept it. That last category is the one auditors ask about and the one teams most often leave undocumented.
Where Should Security Testing Run: In CI, or at a Release Gate?
The answer is both, and the mistake is running the same checks in both places. Every check has a cost in time and a cost in credibility, and the two placements have completely different budgets.
What belongs on the pull request
Fast, high-confidence, scoped to the diff. Secrets scanning on the changed files. SAST on changed code only, with the baseline applied. A dependency check on newly added packages, not the whole tree. Together that should finish in a couple of minutes, and it can block, because the findings are genuinely the author's and genuinely actionable while the code is still in their head.
The discipline is refusing to add anything slow here. Every minute added to the pull request path gets paid by every developer on every change forever, and the moment the security stage becomes the slowest stage, someone will propose making it non-blocking and they will be right.
What belongs on merge to trunk
The slower analysis that does not need to hold up a review. Full-repository SAST with the deeper engine. Complete dependency resolution across the whole tree, including transitive paths. Container image scanning of the built artifact. The authorisation test suite. Licence compliance checks. These can take longer because nobody is watching, and they still fail loudly enough to be dealt with the same day.
What belongs at the release gate
The expensive and environment-dependent work. An authenticated DAST scan against a deployed staging instance. Infrastructure configuration checks against what is about to be deployed. SBOM generation and artifact signing. A check that no finding above your agreed threshold is unresolved and unaccepted, with the record of who accepted what.
The gate should be automated but it should not be absolute, because an absolute gate with no documented override is a gate that gets bypassed informally the first time something urgent has to ship. Better to have a break-glass path that is loud, logged, and requires a named person to own the decision.
What belongs on a schedule, outside the pipeline entirely
New vulnerabilities are published against code you have not changed, so a daily scan of the current release against updated databases catches what a build-time scan cannot. External surface discovery belongs here too, since the API version nobody remembers deploying will not appear in any pipeline. Weekly full DAST against staging, monthly review of suppressions and accepted risks, and a quarterly look at whether the rules still match the codebase.
One organisational point that matters more than the placement. Findings from any of these should land in the same tracker your engineers already use, with the same fields and the same triage process as a bug. A separate security tool that only the security team looks at is where findings go to age quietly.
What a Security Testing Engagement Actually Covers
Not every engagement includes all of this, and the order is set by the assessment. Turning on more scanners before the existing output is triaged is the most common way to make things worse while appearing to make progress.
An assessment of what you already have
The first week produces findings about your process, not about your code. What tooling is running, where, and does anything actually block. How many findings exist, how old is the oldest, and who has ever closed one. What the suppression list looks like. Whether the dependency tree resolves reproducibly. Whether authorisation is tested at all. Where secrets currently live and how they got there. Whether a threat model exists for anything.
That produces a short document with a prioritised list, and it is useful on its own. Several engagements have ended there, with the client's own team executing the list, and that is a legitimate outcome.
Tool selection, configuration and tuning
Choosing tools that fit your languages and your budget, configuring them against your frameworks rather than their defaults, writing custom rules for the patterns specific to your codebase, and establishing baselines so the gate is enforceable. Where you already own a commercial tool, we tune that rather than argue for a replacement, because a tuned tool you have already paid for beats an untuned tool you have not.
Pipeline integration at the right stages
Wiring the checks into pull request, merge, release and scheduled runs as described above, with the reporting routed to where your engineers already work. This is a joint piece of work with whoever owns your build system, and it is where most of the practical friction lives.
Authorisation and business logic test suites
The role and resource matrix, the cross-boundary test cases, the multi-tenant isolation checks, and the business flow abuse cases that matter for your product. Written as tests in your repository, in your test framework, running in your pipeline. Not a report.
Dependency and supply-chain hardening
Reproducible resolution, an upgrade policy with automation, SBOM generation attached to releases, registry scoping to close the confusion path, and a review step for new dependencies. Plus the actual work of clearing the backlog of reachable vulnerable components, which is usually the largest single chunk of remediation effort.
Secrets remediation and prevention
History scan with verification, the rotation programme for anything live, pre-commit and push protection, and where practical the architectural change that removes the need for the long-lived credential at all.
Handover that makes us unnecessary
The definition of done is your team running this without us. That means documented triage process with owners and response times, the rule set in version control with comments explaining each custom rule, runbooks for the common finding types, the threat model and its diagram, and a short written record of what we deliberately did not cover so nobody assumes coverage that does not exist.
Manual penetration testing and red team exercises are a separate engagement with a different shape, different people and a different reporting cycle. We scope it separately rather than folding a few days of manual probing into a tooling engagement and calling it a pen test.
How the Engagement Runs, Week by Week
Below is the shape of a typical first engagement. Scope and duration are agreed with you before anything starts, and the sequence adapts to what the assessment finds.
Week one: measure and map
Read-only access to the repositories, the build system and a non-production environment. We inventory the tooling, count and sample the findings, scan history for secrets with verification enabled, check whether the build resolves reproducibly, and sit in on a real deploy. No configuration changes yet. The output is the assessment document and a proposed order of work with effort against benefit.
Week two: baseline and quiet the noise
Rule tuning, baselines established, the worst offending rules replaced with custom equivalents, and the first version of the triage process agreed with a named owner on your side. By the end of this week the pull request check should be fast enough to block and quiet enough to be believed.
Weeks three and four: the high-value gaps
Usually authorisation testing and secrets remediation, because those are where the real exposure sits. The role and resource matrix gets built with your product people, not just your engineers, since only they can say what the rules are meant to be. Any live credentials found in week one are rotated in this window, in coordination with whoever owns the systems they reach.
Weeks five onward: supply chain, dynamic testing and the backlog
Dependency resolution fixed, SBOM generation wired into the build, authenticated DAST configured against staging, and the accepted backlog worked down in priority order alongside the new work. This is also where the threat model gets run for whichever part of the system is changing most.
Throughout: written reporting you can forward
A weekly written summary covering what changed, what the finding counts did and why, what needs a decision from you, and what is blocked. Written first, because a distributed engagement that depends on calls to transfer state will lose state. If your board or your customers need a version of this, we write it in language they can read rather than pasting a scanner dashboard into a slide.
Four Situations We Get Called Into
These are archetypes, described from the shape of the problem rather than from any named client. If one reads like your quarter, the diagnosis is the part worth arguing with.
The enterprise deal that arrived with a security questionnaire
A twenty person product company signs its largest customer, and the customer's procurement team sends a two hundred question security questionnaire with a deadline. Nobody at the company has seen one before. Several questions ask about things that genuinely do not exist: a documented vulnerability management process, evidence of testing, an inventory of third-party components.
The work here is sequencing, because everything cannot be built at once and some answers are more expensive to fake than to fix. We map the questions to what actually exists, build the missing pieces with the largest effect first, which are usually dependency scanning with a documented triage process and an SBOM, and write honest answers with remediation dates for the rest. Buyers accept a credible plan far more often than teams expect. What the questionnaire's compliance references require of you specifically is a conversation for your counsel and your auditor, and we build against their reading rather than inventing one.
The scanner that has been red for eighteen months
A mid-sized engineering team turned on the code host's default scanning and never triaged it. There are thousands of open alerts across forty repositories, no owner, and a shared understanding that the alerts are noise. Somebody senior has now asked whether there is anything real in there, and nobody can answer.
We treat the pile as an archaeology problem. Deduplicate across repositories, discard anything in dead code or archived repositories, rank by reachability and by whether the component is on the KEV list, and produce a list of genuine issues that usually turns out to be one or two percent of the total. Then baseline the rest so new code is held to a real standard, and put the actual list into the normal sprint process with owners. The point is not to close everything. It is to make the red mean something again.
The multi-tenant SaaS that has never tested isolation
A platform with tenant separation enforced by a where clause in every query, added by convention rather than by construction. It works, as far as anyone knows, because nobody has ever tried to break it. The team is now onboarding a customer whose security team will try.
We build the isolation test suite: two real tenants, real object identifiers, and systematic cross-tenant requests across every route derived from the API specification. In this pattern the failures are rarely uniform. It is almost always a handful of newer endpoints, a reporting or export path, and something in an admin surface where a support tool takes a tenant identifier as a parameter and trusts it. The durable fix is moving isolation from convention to construction, so a query cannot be written without the tenant scope, and the test suite is what stops it drifting back.
The API that grew without an inventory
A company with a mobile app, a web app and several partner integrations has accumulated three generations of API. Version one was never turned off because one partner still uses it. The OpenAPI specification describes version three only. Nobody is certain what is deployed on the older subdomains.
The first deliverable is not a test at all, it is an inventory: what is listening, what routes it serves, what it authenticates against, and who uses it. That work regularly finds an endpoint that predates the current authentication system entirely. Then the older surfaces get tested and either hardened or scheduled for shutdown with the partners told in advance. This work overlaps heavily with API design and is usually best done with whoever owns those contracts in the room.
How Does a Security Testing Team in India Work Across Your Timezone?
Overlap matters here because the parts of the work that need two people awake at once are rare but real, so it is worth knowing exactly how much window you actually have rather than a vague reassurance. A 09:30 to 18:30 IST day, converted properly rather than rounded, breaks down like this.
London gets four genuine hours of overlap in winter and five once British Summer Time starts, which is enough for a scheduled call without moving anyone's day around. Sydney gets roughly two hours as things stand, stretchable to about four and a half if the Indian day starts at 07:00 IST instead of 09:30. Auckland gets almost nothing on a standard schedule, and needs that same early shift to claw back three and a half hours against a normal afternoon there.
New York is the one to be straight about. An 18:30 IST finish lands at roughly 08:00 Eastern, ahead of most people's first coffee, so a standard day hands you zero overlap. Buying three hours with the East Coast means the Indian day runs to 22:30 IST; four hours with the West Coast pushes it past midnight. Both are a real night shift, with the retention and scheduling cost that comes with one, not something we tick off for free. If a vendor offers round-the-clock security coverage without saying which of their engineers is awake at 2am to deliver it, ask them directly. We set the actual overlap window, written down, before the engagement starts.
Why this work suits low overlap better than most
Almost everything produced here is an artefact in your repository: rule files, test suites, pipeline configuration, an SBOM in the build, a written assessment. All of it arrives as pull requests, gets reviewed by your engineers on your schedule, and is verified by your own pipeline rather than by our word. There is very little that needs two people awake at once.
The exceptions are real and we name them in advance. The first authenticated dynamic scan against a shared staging environment should be watched by somebody on your side, because a badly scoped scanner can create test data or trip alerts. Credential rotation needs whoever owns the downstream systems available. And the threat model works far better as a live conversation than as an asynchronous document, so we schedule those inside the overlap window and accept fewer of them rather than doing them badly.
How the day actually runs
Written first, always. A daily written standup in your Slack or Teams channel before your morning: what moved, what is blocked, what needs a decision from you. Live calls two or three times a week inside the agreed window rather than daily, because a daily call on a four hour overlap eats the window you needed for pairing. Decisions come to you as written proposals with options and a recommendation, since an open-ended question costs a full day of round trip.
One rule specific to security work: anything that looks like an active exposure, a live credential, evidence of a vulnerability being probed, an unauthenticated administrative surface, is escalated immediately through an agreed out-of-hours channel and does not wait for the next standup. We agree that escalation path in week one, including who to reach and what qualifies, because deciding it during an incident is too late.
Access, code ownership and data handling
Work happens in your repositories, your build system and your environments under named individual accounts with scoped, time-limited roles, so your audit log shows exactly who did what. Read-only until write access is genuinely needed. No production data is copied anywhere for testing; where realistic data is needed, it is generated or masked in your environment. Nothing is built in a private copy and handed over later.
IP assignment, confidentiality, background checks, device policy and access revocation are specific terms that live in the signed agreement, not on this page, and we work through them with you before anything starts rather than reciting a policy that may not fit your situation. A vendor security questionnaire is welcome, and it lands better before the engagement begins than halfway through it.
The talent question for this specific skill
Plenty of engineers in India can point a scanner at a target and forward the report. Far fewer can explain why a finding is real, tune a rule set so it stops crying wolf, write the query that catches a pattern a canned rule misses, or build an authorisation matrix straight from your product's actual permission model. That second group is who we recruit for this work, and the screening reflects it: a candidate gets a repository seeded with genuine findings and has to say which ones matter and defend the answer, which separates people who can read tool output from people who understand the code underneath it. Their written English gets the same test, through the finding summary itself, since that is what you will actually receive. A good share of this bench came up through application development rather than a dedicated security track, which is part of why the staffing pool overlaps with our dedicated DevOps developers in India and the engineers you would otherwise hire directly as security testers.
What Goes Wrong, and How We Handle It
These are the problems that come up often enough to be worth naming before they happen, rather than after.
The assessment finds something live in week one
A verified credential still working, an unauthenticated administrative endpoint, an old API version with no authentication at all. This changes the plan immediately, and the tuning work waits. We agree the escalation path before starting for exactly this reason, and we do not sit on a live finding until the weekly report.
Remediation is not our decision to make
We can find, prioritise and often fix, but a fix that changes behaviour needs your product judgement. Tightening an authorisation rule may break an integration somebody relies on. Upgrading a major dependency version may require a migration nobody has scoped. We present these as decisions with options and consequences rather than shipping them and finding out.
The finding count goes up before it goes down
Better tuning and better coverage produce more real findings, not fewer, and the graph looks alarming halfway through. We say this at the start and report the number that actually matters, which is the count of genuine open findings above threshold, not raw alerts. Executives who were not warned reasonably conclude that things are getting worse.
Nobody on your side owns triage
The most common cause of an engagement not sticking. If there is no named person receiving findings after we leave, the process decays within a quarter and the scanner is back to being ignored. We ask for that name in week one and design the workload around what one person can realistically carry, because a triage process that assumes a full-time role you do not have is a process that will not survive.
A security fix collides with a release
There is always a week when the fix and the launch want the same code. The way through is agreeing the severity thresholds up front: what ships regardless, what blocks, and who is allowed to accept the risk. Decided in advance, that conversation takes ten minutes. Decided during release week, it takes two days and creates a precedent.
Continuity of the people doing the work
Security engineers get poached, the same as everyone else, and pretending otherwise would be dishonest. What actually protects you is not a promise about tenure, it is how the knowledge is held: no single person is the only one who understands your authorisation rules or your finding backlog, every runbook is reviewed by someone other than whoever wrote it, and the rule sets, scripts and reports live in your repository from week one rather than in someone's head. The commercial side of notice, handover and replacement sits in the agreement, not on this page, and we write it down before work starts rather than letting you find out later.
Compliance: SOC 2, ISO 27001, GDPR, HIPAA and PCI DSS
Security testing and compliance are related but they are not the same thing, and conflating them causes expensive confusion in both directions. A system can pass an audit and still be insecure. A well-tested system can still fail an audit because the evidence was never captured.
What we can build is the technical evidence side: scan results attached to specific releases with timestamps, a documented triage process with named owners and recorded decisions, artifact signing and provenance, access records showing who had what and for how long, an SBOM per release, and a record of accepted risks with the person who accepted each one and when it expires. That evidence is what most technical control questions come down to in practice.
What we will not do is tell you what any of these frameworks requires of you, or whether you meet it. Scope, control selection, data classification, breach notification obligations and the legal reading of a regulation are matters for your auditor and your counsel. Work those through with them, then send us their answer and we will build against it. Pillai Infotech makes no certification claim of its own and does not present itself as an assessor, and we would treat any supplier who told you they could make you compliant with some caution.
Two practical notes that come up in nearly every engagement. First, most frameworks care as much about the process being consistent and documented as about any single technical control, so a modest set of checks that always run and are always triaged beats an elaborate set that runs sometimes. Second, decide the data handling questions before testing starts rather than during: what data our engineers may see, whether any of it may leave your environment, and what happens to test artefacts afterwards. Those answers shape how the testing is built, and retrofitting them is far more expensive than agreeing them in week one.
Engagement Models
Security testing assessment
A fixed-scope review producing the tooling inventory, a sampled finding quality analysis, the secrets history scan with verification, the dependency and reproducibility check, an authorisation coverage gap list and a prioritised plan with effort against benefit. Useful on its own, and the usual starting point. You keep the document whatever happens next.
Project engagement
A defined build against agreed scope: tune and integrate the tooling, build the authorisation test suite, harden the supply chain, clear a specific backlog, prepare the technical evidence your auditor asked for. Scoped after the assessment, because scoping this work before measuring it produces an estimate that is fiction.
Dedicated engineers
One or more security-focused engineers inside your team, your board and your review process on an ongoing basis. Suits organisations where this is a permanent surface with a queue of work rather than a one-off project, and where somebody needs to own triage every week. Composition and duration are agreed with you before starting.
Most engagements start as an assessment and become one of the other two, which is deliberate. We would rather quote a build against measurements than against a conversation. If you already know exactly what you need and have the numbers behind it, we can start at the second model.
Where This Sits Alongside Our Other Work
Security testing rarely arrives alone. Where the wider question is architecture, monitoring and incident response rather than testing specifically, our cybersecurity services cover that ground and this work usually sits inside it. Where the gates need to be wired into your build system properly, that is CI/CD pipeline work, and the two are frequently scoped together because a security check that is not enforced by the pipeline is a suggestion.
If you want the practice built into how your team already works rather than bolted on afterwards, our write-up on integrating security into the delivery pipeline covers the cultural half of that problem, which is usually the harder half. And if what you need is people rather than a scoped project, you can hire dedicated security testers or bring in DevOps developers in India who will own the gates alongside the rest of your delivery tooling.
Manual penetration testing, red team exercises and incident response retainers are separate engagements with separate scoping. We keep them separate on purpose, because a few days of manual probing bundled into a tooling project is neither a good pen test nor a good tooling engagement.
Frequently Asked Questions About Security Testing in India
What is the difference between security testing and a penetration test?
Security testing is the continuous, automated and repeatable part: static analysis on every pull request, dependency and secrets scanning, authenticated dynamic scans on a schedule, and authorisation checks written as tests. A penetration test is a time-boxed human exercise where somebody creative tries to break the running system. They answer different questions. A pen test finds what your tooling cannot imagine; the tooling stops the same class of bug reappearing next Tuesday. We keep them as separate engagements on purpose.
Our scanner already reports thousands of issues. What do you do differently?
We stop treating the backlog as a to-do list. The first move is a baseline that freezes existing findings so new code is held to a standard the old code is not, then rule tuning against your actual frameworks so the noisiest checks stop firing. After that we rank what remains by reachability and exploitability rather than raw CVSS, using EPSS and the CISA KEV catalogue. A list of forty real findings gets fixed. A list of four thousand gets ignored.
Can you test authorisation logic that a scanner cannot see?
Yes, and it is usually the highest-value part of the work. Broken object level authorisation cannot be found by pattern matching because the request is perfectly well formed; only your business rules say it is wrong. We build a matrix of roles against resources, then drive real requests with one user's token against another user's object identifiers and assert the response code. Those checks then live in your test suite and run forever.
How do you handle a secret that has already been committed?
Rotate first, then clean up. Once a credential has reached a remote repository you have to assume it is compromised, because forks, clones, CI caches and mirrors all keep copies that rewriting history will never reach. So the order is revoke the credential, issue a replacement, check the audit logs for use during the exposure window, and only then rewrite history if you still want to. Removing the commit without rotating is the mistake we see most.
Do we need an SBOM, and what do we do with it?
You need one the moment a customer or auditor asks what is inside your product, and increasingly they do. Generate it at build time in CycloneDX or SPDX format, attach it to the release artifact, and store it so you can query old releases later. The value shows up on the day a new critical CVE lands: instead of a week of guessing, you answer which versions shipped the affected component in minutes.
Should security scans block a pull request or only a release?
Both, with different rules. On the pull request, scan only the diff, keep it under a couple of minutes, and block on high-confidence findings in changed code such as a hardcoded secret or an injected query. At the release gate, run the slower work: full dependency resolution, authenticated dynamic scan, container image scan and licence checks. Blocking every pull request on the full suite trains people to bypass the whole thing.
Can you help us pass a SOC 2 or ISO 27001 audit?
We can build the technical evidence your auditor asks for: scan results attached to releases, signed artifacts, access records, and a documented triage process with owners and timestamps. What we do not do is tell you what a framework requires or whether you are compliant. Scope, control selection and interpretation belong with your auditor and your counsel, and we build against their answer rather than ours.
How does a security testing team in India work with our timezone?
A standard 09:30 to 18:30 IST day gives a UK team roughly four to five hours of live overlap and a US East Coast team almost none, so the shift pattern is agreed with you before work starts. The work suits low overlap well because the output is rules, tests and pull requests in your repository, verified by your own pipeline. Anything genuinely sensitive, such as a first authenticated scan against staging, is scheduled inside the overlap window.