← Όλα τα άρθρα

Next.js: 13 security advisories. Οδηγός

Μετά τα 13 Next.js security advisories, συμπεριλαμβανομένων πέντε High-severity auth bypasses, αναβαθμίζω άμεσα κάθε site και μετά αναλύω τους κινδύνους.

Next.js: 13 security advisories. Οδηγός

Τον Μάιο το Next.js έβγαλε security release. Δεκατρία advisories μαζί, σε όλες τις εκδόσεις που είναι ακόμα σε χρήση: 13.x και 14.x ολόκληρες, 15.x μέχρι 15.5.17, 16.x μέχρι 16.2.5. Στο ίδιο παράθυρο μπαλώθηκαν και τα react-server-dom-* πακέτα της React.

Φτιάχνω Next.js sites επαγγελματικά. Τέτοιο release δεν με πιάνει έκπληξη — είναι απλώς Τρίτη. Παρακάτω η σειρά που ακολουθώ.

Πρώτα αναβάθμιση, μετά ανάλυση

Οι σωστές εκδόσεις είναι Next.js 15.5.18 και 16.2.6, React 19.0.6 / 19.1.7 / 19.2.6. Όλα τα sites μου τρέχουν 15 ή 16, οπότε ξεκινώ παντού το ίδιο:

npm i next@15.5.18 react@19.1.7 react-dom@19.1.7
npm run build   # if it builds, deploy it

Ένα patch bump στο ίδιο major σπάνια χαλάει το build. Αν περιμένω να καταλάβω και τα 13 CVEs πριν κάνω deploy, η δουλειά μιας ώρας γίνεται δουλειά της άλλης εβδομάδας. Αναβάθμιση, build, deploy — και μετά διαβάζω.

Τα DoS bugs δεν είναι ο κίνδυνος

Τρία advisories αφορούν denial of service: το CVE-2026-23870 στα Server Functions και ένα connection-exhaustion bug στα Cache Components. Ακούγονται άσχημα. Για τα sites που χτίζω δεν είναι πρόβλημα — τρέχουν πίσω από Vercel και Cloudflare, και τα δύο ενεργοποίησαν managed WAF rules για DoS από προεπιλογή. Χειρότερο σενάριο: κάποιος επιβραδύνει το site για λίγο.

Αυτά που με νοιάζουν είναι τα πέντε middleware bypasses, όλα High:

Είναι τα πιο επικίνδυνα γιατί ο κώδικας φαίνεται μια χαρά. Ο έλεγχος τρέχει, περνάει code review, και παρακάμπτεται εν αγνοία σου. Δεν υπάρχει bug στον κώδικά σου — το framework απλώς αφήνει ένα crafted request να φτάσει στη σελίδα χωρίς να περάσει από αυτόν.

Το middleware δεν ήταν ποτέ η κλειδαριά

Εδώ αξίζει να σταθούμε λίγο. Πολλά Next.js tutorials — και δικά μου κάποια στιγμή — βάζουν τον auth έλεγχο στο middleware.ts και τελειώνουν εκεί:

// middleware.ts — fine as a redirect, NOT a security boundary
export function middleware(req: NextRequest) {
  const token = req.cookies.get('session')
  if (!token) return NextResponse.redirect(new URL('/login', req.url))
}

Το middleware βολεύει για να ανακατευθύνεις αποσυνδεδεμένο χρήστη πριν δει το protected layout. Ως μοναδικό φράγμα ασφαλείας είναι επικίνδυνο — τρέχει στο edge, πριν ξεκαθαρίσει το route, κι ακριβώς εκεί χτύπησαν τα bypasses. Αν η παράκαμψη του middleware εκθέτει δεδομένα, τα δεδομένα δεν ήταν ποτέ ασφαλή.

Ο πραγματικός έλεγχος ανήκει εκεί που διαβάζονται τα δεδομένα — μέσα στο Server Component ή το Server Action, δίπλα στο query:

// app/dashboard/page.tsx
export default async function Dashboard() {
  const user = await requireUser()   // throws/redirects if no valid session
  const rows = await prisma.invoice.findMany({ where: { userId: user.id } })
  // ...
}

Ένα bypass μπορεί να ξεγλιστρήσει από το middleware. Δεν μπορεί να ξεγλιστρήσει από ένα requireUser() που κάθεται ανάμεσα στο request και τη βάση δεδομένων.

Η checklist όταν πέφτει το release

Αυτό ακριβώς κάνω:

  1. Bump Next και React στις διορθωμένες εκδόσεις σε κάθε site. Build, deploy.
  2. Grep για auth που υπάρχει μόνο στο middleware.ts. Ο πραγματικός έλεγχος πάει δίπλα στα δεδομένα.
  3. Επιβεβαιώνω ότι τα WAF managed rules είναι ανοιχτά στο CDN — δωρεάν προστασία από τα DoS bugs.
  4. Σημειώνω την έκδοση που τρέχω τώρα, για να ξέρω τον επόμενο μήνα τι ήταν «current».

Τι θα έκανα διαφορετικά

Θα σταματούσα να θεωρώ ότι το «build πέρασε, deploy πράσινο» κλείνει τη δουλειά. Auth μόνο στο middleware βρίσκεται παντού στα tutorials — το έχω γράψει κι εγώ έτσι. Να μεταφέρεις τον έλεγχο δίπλα στα δεδομένα είναι δουλειά είκοσι λεπτών. Αξίζει να το κάνεις από αρχή, πριν κάποιο CVE σε αναγκάσει.

Patch γρήγορα. Η κλειδαριά ανήκει στην πόρτα, όχι στο διάδρομο.

FAQ

Πρέπει να αναβαθμίσω τώρα κι αν δεν χρησιμοποιώ middleware για auth;

Ναι. Τα DoS bugs και τα υπόλοιπα advisories ισχύουν ανεξάρτητα. Η αναβάθμιση είναι γρήγορη — κάνε την.

Τι γίνεται αν τρέχω ακόμα Next.js 13 ή 14;

Οι 13.x και 14.x περιλαμβάνονται στις affected versions και δεν παίρνουν patches. Πρέπει να ανέβεις σε 15 ή 16.

Είναι το requireUser() κάποια συγκεκριμένη βιβλιοθήκη;

Όχι — είναι η helper function που γράφεις εσύ. Ελέγχει το session, επιστρέφει τον user ή κάνει redirect. Το κρίσιμο είναι ότι τρέχει δίπλα στα δεδομένα, όχι στο edge.