Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Security Checker Laravel Package

jorijn/laravel-security-checker

Laravel Security Checker scans your Composer dependencies for known vulnerabilities using the FriendsOfPHP security advisories database. Run it via an Artisan command or schedule it, and get notified through email, Slack, Telegram, or Discord when security issues affect your app.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Package: jorijn/laravel-security-checker — v3.1.0 (minor release, no breaking changes) Baseline note: No prior assessment existed. This establishes the baseline and incorporates v3.1.0.

Architecture fit

  • The package is a thin, Laravel-native wrapper around a Composer dependency vulnerability audit, delivered as an artisan command plus a scheduler hook and notification channels. It sits alongside — not inside — the application's domain layer, so it imposes no runtime coupling on request handling.
  • Fit is strongest for teams already standardizing on Laravel's scheduler and queue/notification stack: the check is a cron-shaped batch job, results are surfaced through existing channels (mail, Slack, etc.), and configuration follows the framework's config/*.php + .env convention.
  • v3.1.0's two additions (exclude_dev, allow_list) move the package from "informational scanner" toward "governable CI gate." That is the single most important architectural shift in this release: an alerting tool that cannot be tuned gets muted, and a muted scanner provides zero assurance.

Integration feasibility

  • Low integration cost. Composer install, publish config, set env vars, schedule the command. No database migrations, no schema ownership, no service provider conflicts expected.
  • exclude_dev maps cleanly onto the common two-stage pipeline (dev builds vs. production artifacts) and removes a well-known noise source: advisories against require-dev tooling that never ships to production.
  • allow_list is the practically necessary escape hatch for risk acceptance. Without it, every accepted-risk advisory becomes a permanently red build, which in practice leads teams to disable the check entirely.
  • Constraint to plan around: the allow list is configured via a single-quoted JSON array in .env. This is workable in a committed .env.example, but awkward in secret managers and CI variable injection, where quoting and shell interpolation are frequent sources of silent misconfiguration.

Technical risk

  • Allow list as permanent blind spot (highest risk). Entries have no expiry, reason, owner, or ticket reference. There is nothing in the mechanism that forces re-review. Over time the list accretes and the check's effective coverage decays without any visible signal.
  • Brittle matching key. Matching by exact advisory title is fragile — titles are edited upstream, and any reword silently un-suppresses the finding (noisy but safe) or, worse, a title reused across advisories could over-suppress (unlikely but unbounded). CVE identifiers are the durable key; title matching should be treated as a last resort.
  • Fail-open configuration parsing. An invalid allow list is logged as a warning and the check still runs. This is the correct availability trade-off — a malformed config must never silently disable scanning — but it means a typo produces more findings, not fewer, and the warning competes with normal log volume. It will be missed unless routed somewhere durable.
  • Suppression semantics are under-specified for our purposes. Unclear whether allow-listed findings are omitted from the report entirely or merely downgraded. For audit evidence we need to know that a suppressed finding was seen and accepted, not that it never existed.
  • No new attack surface introduced by this release; both features are additive configuration.

Key questions

  1. Does the allow list suppress findings from the report/notification payload entirely, or is there a residual record that the finding existed and was suppressed?
  2. Is matching case-sensitive, and does it apply to CVE identifiers only or also to GHSA/advisory IDs we may receive instead?
  3. Does exclude_dev change what is audited (dependency graph resolution) or only what is reported? These have different assurance implications.
  4. Can configuration be overridden per-environment, or is the allow list global to all deployments?
  5. What is the intended governance model for the allow list — who approves entries, and is there any recommended review cadence in the README?
  6. Where does the invalid-config warning surface (log channel, stderr, exit code)? Does the command's exit status still reflect vulnerabilities correctly when the allow list fails to parse?

Integration Approach

Stack fit

  • Requires PHP and Composer with a Laravel application that has the scheduler running. Notification delivery reuses Laravel's existing mail/Slack/webhook configuration, so there is no new outbound integration to provision or security-review.
  • Pairs naturally with existing CI: the artisan command can be invoked directly in a pipeline step or left to the scheduler for a nightly sweep. The two are complementary — CI for pre-merge gating, scheduler for catching advisories disclosed after deploy.
  • No conflict expected with dependency-update automation already in place (Dependabot/Renovate); in fact the allow list becomes the coordination point between those tools and this scanner.

Migration path

  • Straightforward: bump the constraint to ^3.1, run composer update jorijn/laravel-security-checker, republish/merge the config if new keys are added there.
  • Backward compatible by construction — both features are opt-in. Default behavior with no env vars set is identical to v3.0.0.
  • Rollback is a version pin revert; no persisted state, no migrations, nothing to unwind.

Compatibility

  • No deprecations or removals announced. Existing LCS_* environment variables continue to work.
  • .env handling of the JSON array is the only real compatibility wrinkle: values must be single-quoted, and any deployment path that rewrites .env programmatically (container entrypoints, templating, secret injection) must preserve that quoting. Test this in the actual deployment mechanism, not just locally.
  • Local developer machines, CI, and production should each be validated independently — three different .env origins is three chances to break quoting.

Sequencing

  1. Upgrade and verify parity. Ship v3.1.0 with no new config. Confirm output matches v3.0.0 exactly. This isolates the upgrade from the feature adoption.
  2. Adopt exclude_dev in CI first. Low-risk, immediately reduces noise, and produces a cleaner signal to evaluate before introducing suppression.
  3. Establish an allow list policy before adding the first entry. Define owner, required justification, mandatory ticket reference, and a review cadence. Creating the policy after the list has ten entries is materially harder.
  4. Introduce allow_list incrementally, starting with entries that are genuinely accepted risk (no fix available, or mitigated by compensating controls). Prefer CVE identifiers over titles.
  5. Wire the invalid-config warning into a monitored destination and add a synthetic check that a deliberately malformed allow list produces a visible alert — the fail-open path is only safe if someone is watching it.
  6. Add a periodic allow-list audit (quarterly recommended) as a recurring task with a named owner, and pair it with a report of currently-suppressed advisories.

Operational Impact

Maintenance

  • Low ongoing engineering cost. The package tracks Composer/Laravel versions closely; expect routine minor bumps roughly a few times a year.
  • The real maintenance burden shifts to allow list hygiene, which is human, not technical. Treat the list as a governed artifact under review, not as configuration. Without that discipline this release's headline feature becomes its headline risk.
  • exclude_dev should be reviewed whenever the dev dependency set is reorganized — a package moved from require-dev to require would silently enter scope, which is the correct behavior but worth confirming rather than assuming.

Support

  • Self-service for the team that owns the Laravel app. No dedicated platform support needed.
  • The first-line triage question changes with this release: previously "is this advisory real?", now "is this advisory on the allow list and is that still correct?" Support documentation should reflect that.
  • Invalid allow list errors are self-describing (logged as a warning) but easy to miss — support runbooks should name the log location explicitly.

Scaling

  • Scales well. The check is a periodic batch job against the Composer dependency graph; cost is roughly constant per application and grows with dependency count, not with traffic. No user-facing latency impact.
  • The one dimension that does not scale gracefully is people: allow lists are per-application, so a portfolio of N apps accumulates N lists with no shared visibility. At small scale this is fine; past roughly a dozen applications, central aggregation of suppressed findings is worth building.

Failure modes

  • Silent over-suppression — the most consequential failure. A broad or stale allow list entry hides a live vulnerability with no signal. Mitigated only by process, not by the tool.
  • Silent under-suppression — invalid JSON in LCS_ALLOW_LIST is logged and ignored. Behavior degrades to "no allow list," which is noisy and safe, but the operator may not realize their suppression intent was dropped.
  • Alert fatigue → disabled check — the failure mode this release exists to prevent. If allow-list governance is absent, the team may return to muting the check wholesale, which is strictly worse than a curated allow list.
  • Notification delivery failure — inherited from the underlying channel configuration; a broken Slack webhook means findings are detected but never surfaced. Monitor channel health independently.
  • Schedule drift — if the scheduler stalls, the check silently stops running. Alert on absence of the periodic run, not just on its output.

Ramp-up

  • Roughly half a day for a developer familiar with Laravel and the existing CI: install, publish config, verify parity, wire into the pipeline.
  • Add a few hours for the policy and runbook work — defining allow-list ownership, the justification format, and the review cadence. This is the part that determines whether the release delivers value.
  • No specialist security knowledge required to operate; interpreting individual advisories and deciding on acceptance is a judgment call that should sit with an engineering owner, with security consulted for anything rated high or critical.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource