Safeguard
Supply Chain Security•

BOOKOFF Breach: 6.38M Members, Password Hashes and Ex-Members

BOOKOFF says 6,427,735 member records (6,383,279 people, 212,371 ex-members) left its system with password hashes. What leaked and what to change now.

Safeguard Security Team
37 min read

BOOKOFF GROUP HOLDINGS says a third party broke into the domestic BOOKOFF member management system and sent out 6,427,735 member records, covering 6,383,279 people, including 212,371 who had already cancelled. Names, contact details, birth dates and password hashes left. Members should change reused passwords now; teams should check hash schemes and retention.

BOOKOFF GROUP HOLDINGS (ブックオフグループホールディングス, TSE Prime, securities code 9278) runs Japan's best known chain of second hand book, media and goods shops. The affected system belongs to its consolidated subsidiary BOOKOFF Corporation and holds the profiles behind the BOOKOFF app, the official online store and web membership. This post works from the company's TDnet filings, customer FAQ and notices, translated from Japanese, and quotes every figure exactly as filed. The company has not said how the attacker got in, and we do not guess. Where this post mentions the wider run of Japanese breaches this autumn, the link is timing only.

What happened

On Tuesday 6 October 2026 BOOKOFF Corporation confirmed unauthorized third party access to its member management system. System records showed member information was obtained from outside between 4 and 6 October. The company cut the attacker's communications and access route, and says every acquisition route identified so far is contained.

A first notice followed on 9 October, a second report with confirmed counts on 13 October, and a correction adding two omitted fields on 16 October. Emails to affected members ran from 15 to 22 October. A dedicated free phone line opened on 22 October and a self service lookup on 23 October.

Timeline

All times are Japan Standard Time. Where a filing gives only a date, the table gives only a date.

Date (JST)EventSource
4 to 6 Oct 2026Member information held in the system is obtained from outside, as later confirmed from system recordsSecond report, 13 Oct
6 Oct 2026 (Tue)Unauthorized third party access to the member management system confirmedFirst notice, 9 Oct; second report
8 Oct 2026JPCERT/CC publishes alert JPCERT-AT-2026-0030 on a run of intrusions at Japanese organisations (general, does not name BOOKOFF)JPCERT/CC
9 Oct 2026First notice: up to about 6.43 million member records may have leaked; nine data fields listed; report to the Personal Information Protection Commission (PPC) under wayTDnet first notice
13 Oct 2026, 15:30Second report filed with confirmed counts, scope tables and the decision to withhold technical details; Q1 earnings filings note the impact is under reviewTDnet second report; Nikkei disclosure index
15 Oct 2026 (Thu)Individual emails to affected members beginSecond report, section 3
16 Oct 2026Correction: "occupation" and "nickname" added to leaked fields; counts unchanged. The Q1 supplementary deck is corrected the same wayTDnet corrections
22 Oct 2026 (Thu)Emails to all deliverable addresses completed; dedicated free dial 0120-300-663 opens23 Oct notice
22 Oct 2026Separate notice of temporary maintenance on group related sites, with no reason statedGroup notice, 22 Oct
23 Oct 2026Self service lookup added to the member site; FAQ updated; JPCERT/CC updates its alert with a new case and new indicators23 Oct notice; FAQ; JPCERT/CC

The 22 October maintenance notice says only that some sites and services may be unavailable. It does not mention the breach, and we are not connecting the two.

What is still unknown

  • How the attacker got in. The first notice says the company blocked the attacker's traffic, "corrected the vulnerability" and blocked external access to the target system. The second report declines to publish the system configuration, the vulnerability or the attack method, on the grounds that doing so could invite further unauthorized access. No CVE, product name or vendor has been named.
  • The password hashing scheme. Neither filing names an algorithm, a salt or a work factor.
  • Whether the data has been misused. As of 13 October the company had confirmed no publication of the data, no point fraud and no tampering with real members' records.
  • The cost. Under review and not in the forecast for the fiscal year ending May 2027.

The numbers, exactly as filed

The second report, filed on TDnet on 13 October, replaced the first notice's estimate with confirmed counts. Here they are, translated as closely as possible.

Item (Japanese label)Confirmed figure
Leaked member data count (漏えい対象会員データ数), by member number6,427,735 records
Number of people affected (漏えい対象者数)6,383,279 people
Of whom, active members (有効会員)6,170,908 people
Of whom, cancelled members (退会会員)212,371 people

The first notice, on 9 October, had said "up to about 6.43 million" records (最大 約643万件) and noted that this was a count of member numbers, not of people.

Records versus people

The company defines the two figures carefully. The record count is the number of member numbers for which the system's own records show the member information was sent outside. The people count treats several member records registered with the same email address as one person. That difference in method is why the two numbers differ, by 44,456 on our arithmetic.

The record count is the better measure of what an attacker now holds; the people count is the better measure for notification, which is why BOOKOFF emailed by address. Someone who registered twice with different addresses counts twice even in the people figure, which is why the FAQ asks people with several accounts to check each one.

Active and cancelled members

The split is the most useful single fact in the filing. Of the 6,383,279 people, 212,371 had already cancelled their membership. Their data was still in the live member management system on 4 October, and it left with everyone else's. Nikkei's headline singled out exactly that point.

The filing does not say why the records were kept, and there can be ordinary reasons, such as fraud review or legal record keeping. What it shows is that people who had left were exposed on the same terms as people who had stayed.

Technical details

Everything in this section comes from the company's own filings unless another source is named. The filings are in Japanese; the translations are ours.

System and services in scope

The breach is limited to one system, the BOOKOFF member management system (ブックオフ会員管理システム). The second report lists the services whose members it holds:

ServiceBusiness segment (as filed)
BOOKOFF SUPER BAZAARDomestic BOOKOFF business
BOOKOFF PLUSDomestic BOOKOFF business
BOOKOFFDomestic BOOKOFF business
BOOKOFF official online store (BOOKOFF 公式オンラインストア)Domestic BOOKOFF business
Asobiba (あそビバ)Domestic BOOKOFF business
BOOKOFF FASHIONDomestic BOOKOFF business
BINGODomestic BOOKOFF business
B・SPORTSDomestic BOOKOFF business
B・STYLEDomestic BOOKOFF business
Rehello by BOOKOFF (stores)Premium service business

Within those services, the members in scope are app members, online store members and web members. Customers who only use a physical member card and never registered in the app or on the web are not included. The FAQ adds a caveat: people who carried their card membership over to the app or web may be in scope.

Services outside the scope

The second report lists hugall, aidect, the Rehello by BOOKOFF e-commerce site, Japan TCG Center, Booklog (ブクログ), Aoyama Book Center (青山ブックセンター) and the BOOKOFF tidy up service as managed in separate systems and outside the incident. The Q1 supplementary deck adds that overseas stores and services are not affected.

Data fields

The leaked field list changed once. The table shows the final position after the 16 October correction.

DataStatusNote
NameLeaked
Date of birthLeaked
GenderLeaked
Occupation (職業)LeakedAdded by the 16 Oct correction
Nickname (ニックネーム)LeakedAdded by the 16 Oct correction
Email addressLeaked
Phone numberLeaked
Postal code and address registered as member informationLeaked
Password hash value (パスワードのハッシュ値)LeakedAlgorithm not disclosed
Point card numberLeaked
Member numberLeaked
Credit card and other payment dataNot leakedNot held in this system
Bank account dataNot leakedNot held in this system
Address entered at in store buy back, and text read from ID documents such as driving licencesNot leakedManaged outside this system; ID images from store buy back are not stored at all
Delivery addresses specified separately from the member address when orderingNot leaked
Pickup address and ID document images submitted for mail in buy backNot leakedHeld in a separate system

The FAQ adds a qualifier that matters for anyone estimating risk: not every member had every one of these fields leaked. The data each person registered differs.

How the filings describe the password data

The two filings use different words for the same field, and the difference is worth noting.

  • The first notice, 9 October, footnotes the field as an "encrypted password" (暗号化されたパスワード) that cannot be read as it is.
  • The second report, 13 October, calls it a "password hash value" (パスワードのハッシュ値) and footnotes it as information produced by converting the password with a fixed method, from which the original password cannot be read directly.

The later wording is more precise and is the one the correction and FAQ keep. No document names the algorithm, salting or work factor, the three facts that decide how expensive the hashes are to crack. We will not guess.

Containment, as described

StepWhenFiling
Blocked attacker communications and the route usedAfter confirmation on 6 OctFirst notice; second report
Corrected the vulnerability; blocked external access to the target systemAfter confirmationFirst notice
Strengthened access control and monitoringAfter confirmationSecond report
Containment of the acquisition routes identified so far completed; no new unauthorized acquisition confirmedAs of 13 OctSecond report
Emergency inspection of all group systems and all environments, with outside expertsUnder way as of 13 OctSecond report
Report to the Personal Information Protection CommissionUnder way 9 Oct; made by 13 OctFirst notice; second report
Consultation with police, preparing to cooperate with the investigationBy 13 OctSecond report

The second report states that the group's systems are operating normally and that the incident does not affect business continuity. Stores, the official online store and the app remained usable.

Official contacts and how to recognise the real email

Phishing that imitates breach notices is a predictable follow on. These are BOOKOFF's official markers:

ItemValueSource
Email subject不正アクセスによる個人情報漏えいに関するお詫びとお知らせ ("Apology and notice regarding a personal information leak caused by unauthorized access")Second report; FAQ
Sender addressbookoff@2902.netFAQ, as of 23 Oct
Email period15 Oct to 22 Oct 2026 for deliverable addresses23 Oct notice
Contact formhttps://www.bookoffgroup.co.jp/contact-us/contact-us-261009/All filings
Original phone line0570-01-2902 (Navi Dial), 10:00 to 18:30First notice; second report
Dedicated free dial0120-300-663, 10:00 to 18:30, every day, from 22 Oct23 Oct notice; FAQ

The notice emails contain no password change link. BOOKOFF says it will never ask for passwords, card or bank details by email, SMS or phone; the first notice adds authentication codes. Go to the official app or site directly.

Wave context: the JPCERT/CC indicators

JPCERT/CC's alert JPCERT-AT-2026-0030 (published 8 October, updated 23 October) covers a run of intrusions at Japanese organisations since around September 2026 that led to large personal data leaks. It describes five patterns, Case A to Case E, with indicators. It does not name BOOKOFF, and BOOKOFF has not tied its incident to any case. We include the indicators because any operator of a consumer app or member system in Japan should check for them, not because they explain this breach. JPCERT/CC itself says the cases do not mean one method was used everywhere.

Case (JPCERT/CC)What it describes
AScanning each target for a range of known vulnerabilities and for management lapses, such as exposed configuration or backup files
BUnauthorized operations through APIs, including analysing public smartphone apps to find endpoints and keys, calling internal APIs not reachable from the app's screens, and using API keys stolen from other breaches
CExploitation of the Metabase SQL injection CVE-2026-72898
DA WAR file planted on an application server reachable from a public web server, containing a JSP web shell
EAttack attempts driven by AI based penetration testing frameworks, including against internet facing WSUS servers

Indicators as JPCERT/CC published them, defanged. It notes some addresses may have been in legitimate use when checked, and that attackers also used Tor exit nodes and residential proxies.

CaseAddresses (JST dates observed or estimated by JPCERT/CC, many approximate)
A20.210.128[.]125 (around 7 Oct)
B, app analysis69.10.51[.]162 (28 Sep to 6 Oct), 207.241.172[.]54 (28 to 29 Sep), 210.149.87[.]120 (21 to 29 Sep), 210.149.87[.]33 (8 to 9 Oct)
B, other3.112.252[.]14 (21 Sep), 31.76.91[.]2 (3 Sep), 54.95.112[.]6 (27 Sep), 136.85.58[.]5 (28 Aug), 136.117.40[.]140 (28 Aug), 141.11.187[.]186 (3 Sep), 172.86.91[.]7 (19 Sep)
C213.163.202[.]171, 221.216.140[.]49, 221.216.140[.]129 (early Aug to early Sep)
D124.133.237[.]18 (around Sep)
E31.59.92[.]155 (4 to 20 Oct), 31.56.206[.]187 (27 Sep to 20 Oct), 38.244.50[.]120, 46.8.227[.]73 (27 Sep to 19 Oct), 64.44.24[.]195 (from 15 Oct), 94.183.184[.]98 (13 to 19 Oct), 94.183.184[.]254 (3 to 20 Oct), 95.182.99[.]112 (4 to 19 Oct), 176.65.144[.]71 (23 Sep to 17 Oct)

JPCERT/CC's 15 October blog on the attack infrastructure lists 118.26.36[.]16 as an additional indicator alongside two of the Case B addresses above.

User agents and TLS fingerprints JPCERT/CC lists for Case B:

TypeValue
User agentcurl/7.88.1
User agentpython-requests/2.34.2
User agentMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36
User agentThe same user agent string as the targeted public app
JA4t13d181100_85036bcba153_d41ae481755e
JA393c7d42c0df602fb91589311534831f5

JPCERT/CC warns that this JA4 value matches a common Python HTTP client and cannot identify an attacker on its own. For Case C it lists the user agents python-requests/2.33.1 and Metabase-GHSA-vwf4/2.0.

Case C in detail: CVE-2026-72898

Case C names an open source product and CVE, so here are its versions. Nothing public says BOOKOFF ran Metabase or that this CVE played any part in its breach.

Metabase's advisory GHSA-vwf4-m7j8-wcjf (6 August 2026) describes an unauthenticated SQL injection into the Metabase application database that can yield administrator access, rated CVSS 10.0. Exploitation is reported: Metabase states it has confirmed active exploitation, and JPCERT/CC's alert JPCERT-AT-2026-0023 says it was exploited as a zero day.

Metabase lineFixed version (Metabase "Patched versions")Affected per JPCERT/CC
63x.63.5Before x.63.5
62x.62.9Before x.62.9
61x.61.11Before x.61.11
60x.60.17Before x.60.17
59x.59.21Before x.59.21
58x.58.24Before x.58.24
Before 58Not affected, per Metabase via JPCERT/CCNot affected

A discrepancy: the GitHub advisory's "Affected versions" ranges end slightly earlier (below x.58.23, below x.63.3) than its "Patched versions". JPCERT/CC treats everything before the patched version as affected; upgrading to the patched version covers both readings. Metabase Cloud was already fixed. The workaround is to block /api/session/reset_password. Metabase says a POST to that endpoint returning 400 followed by GET /api/user/current returning 200 strongly suggests compromise, and that exposed instances should, after upgrading, delete all rows in core_session, review API keys and admin accounts, and rotate connected database credentials.

Why the password hashes matter

Most leaked fields are raw material for phishing. The password hash is the one field that can turn a breach at one retailer into account takeover elsewhere. Its risk depends on three facts BOOKOFF has not published:

  1. The algorithm. Argon2id, scrypt or bcrypt make each guess expensive; a fast general purpose hash makes guessing cheap.
  2. Salting. A unique salt per account forces separate work per hash. Without salts, one guess is checked against millions at once.
  3. The work factor. Even a good algorithm can be configured too cheaply.

For reference, the OWASP Password Storage Cheat Sheet currently recommends Argon2id with at least 19 MiB of memory, two iterations and one degree of parallelism (or one of several equivalent settings), scrypt with a cost of 2^17 and block size 8 where Argon2id is not available, bcrypt with a work factor of 10 or more for legacy systems, and PBKDF2 with HMAC SHA 256 at 600,000 iterations or more where FIPS 140 compliance is required.

Whatever the scheme, weak passwords tend to be recoverable, and the risk then moves to every service where the same email and password were reused. That is why BOOKOFF asks members to change matching passwords elsewhere too. For other operators, the common pattern after large hash leaks is credential stuffing against other logins; that is a general expectation, not a reported fact about this data, which BOOKOFF says has not been seen published.

Why cancelled members were in the data

The 212,371 cancelled members are a retention story. They had ended their relationship with the service, and their records were still in the same live system as active members, reachable by the same path and exported in the same window.

JPCERT/CC's alert makes the same point in general terms. Among its generic countermeasures it lists not keeping data past the retention period set by law or contract, or after its purpose is finished. Two other posts here look at related data minimisation lessons: the Times Car breach, where ID images of withdrawn members were kept for years, and the Capcom ID breach, where stored profile and log data widened what a breach could expose.

Retention decides the size of the worst day: a breach cannot take what is no longer there. For a member system, ask what happens to a row when a member cancels, which fields survive, for how long, where, and who can read them.

Who is affected

GroupAffected?What the filings say
BOOKOFF app membersYesIn scope
BOOKOFF official online store membersYesIn scope
BOOKOFF web membersYesIn scope
Cancelled members who had registered in the app or on the webYes, 212,371 peopleCounted in the 6,383,279
Card only members never registered in the app or on the webNoNot in scope
Card members who moved their membership to the app or webPossiblyCheck with the lookup
Customers of the out of scope group services listed aboveNoSeparate systems
Overseas BOOKOFF customersNoQ1 supplementary deck

What to do now

If you are or were a BOOKOFF member

  1. Check whether you are in scope with the lookup on the BOOKOFF member site, reached from the official site. If you cannot log in, for example because you cancelled, call the dedicated line.
  2. Change your BOOKOFF password in the official app or online store, typing the address yourself.
  3. Change it everywhere you reused it, starting with email, shopping, payment and delivery accounts.
  4. Turn on multi factor authentication, above all on your email account.
  5. Distrust contacts that know your details. Knowing your name, address and birth date proves nothing about who is calling.
  6. Check the sender against bookoff@2902.net and the subject above.

If you run a consumer login service

Large hash leaks raise the odds that stolen credentials are tried against your login. This week:

  1. Watch login failure rates by source. A sudden rise in failed logins spread across many accounts and many IP addresses is the usual signature of credential stuffing.
# Failed logins per source IP in the last day (adjust path and status for your app)
zgrep -h 'POST /api/login' /var/log/nginx/access.log* \
  | awk '$9 == 401 {print $1}' | sort | uniq -c | sort -rn | head -50

# Distinct accounts attempted per IP, from an application log with JSON lines
jq -r 'select(.event=="login_failed") | [.ip, .username] | @tsv' app.log \
  | sort -u | cut -f1 | uniq -c | sort -rn | head -50
  1. Rate limit login, password reset, SMS sending and search, per account and per source, as JPCERT/CC recommends.
  2. Check new passwords against a breached password list at sign up and at change, so a password exposed elsewhere cannot be set again.
  3. Offer and encourage multi factor authentication, and require it for any action that changes the email address or the phone number on file.
  4. Prepare your own phishing guidance now: a page that says what your company will and will not ask for, like the one BOOKOFF published.

Check your logs for the JPCERT/CC indicators

Search web server, load balancer and API gateway logs from late August onward for the addresses JPCERT/CC lists. The pattern below uses real dots, not the defanged form.

cat > jpcert-at260030-ips.txt <<'EOF'
20.210.128.125
69.10.51.162
207.241.172.54
210.149.87.120
210.149.87.33
3.112.252.14
31.76.91.2
54.95.112.6
136.85.58.5
136.117.40.140
141.11.187.186
172.86.91.7
213.163.202.171
221.216.140.49
221.216.140.129
124.133.237.18
31.59.92.155
31.56.206.187
38.244.50.120
46.8.227.73
64.44.24.195
94.183.184.98
94.183.184.254
95.182.99.112
176.65.144.71
118.26.36.16
EOF

# Exact matches on the client IP field (first field in the combined log format)
zcat -f /var/log/nginx/access.log* \
  | awk 'NR==FNR {bad[$1]=1; next} ($1 in bad)' jpcert-at260030-ips.txt - \
  | head -100

# User agents JPCERT/CC lists for the API and Metabase cases
zgrep -hE 'python-requests/2\.3[34]\.|curl/7\.88\.1|Metabase-GHSA-vwf4' /var/log/nginx/access.log* | head -100

If your edge records JA4 fingerprints, search for t13d181100_85036bcba153_d41ae481755e, but only in combination with the other indicators. Ordinary Python clients produce the same value.

Check any Metabase instance you run

# Version reported by the instance
curl -s https://metabase.example.internal/api/session/properties | jq -r '.version.tag'

# Signs of the exploitation sequence Metabase describes
zgrep -hE 'POST /api/session/reset_password HTTP/[0-9.]+" 400' /var/log/nginx/access.log*
zgrep -hE 'GET /api/user/current HTTP/[0-9.]+" 200' /var/log/nginx/access.log*

If the version is below the fixed release for its line, upgrade, then follow Metabase's post upgrade steps. Business intelligence tools are easy to forget: JPCERT/CC specifically warns that systems never meant for the general public, including BI tools and staff management systems, have been breached in this wave.

Audit how your own member system stores passwords

Find out what your hashes actually are. Most formats announce themselves with a prefix.

-- PostgreSQL example; adjust table and column names
SELECT
  CASE
    WHEN password_hash LIKE '$argon2id$%' THEN 'argon2id'
    WHEN password_hash LIKE '$argon2i$%'  THEN 'argon2i'
    WHEN password_hash LIKE '$scrypt$%' OR password_hash LIKE '$7$%' THEN 'scrypt'
    WHEN password_hash ~ '^\$2[aby]\$' THEN 'bcrypt cost ' || substring(password_hash from 5 for 2)
    WHEN password_hash LIKE 'pbkdf2_sha256$%' THEN 'pbkdf2 sha256 (Django style)'
    WHEN password_hash ~ '^[0-9a-f]{32}$' THEN 'bare 32 hex: possibly unsalted MD5'
    WHEN password_hash ~ '^[0-9a-f]{40}$' THEN 'bare 40 hex: possibly unsalted SHA1'
    WHEN password_hash ~ '^[0-9a-f]{64}$' THEN 'bare 64 hex: possibly unsalted SHA256'
    ELSE 'unknown'
  END AS scheme,
  count(*)
FROM members
GROUP BY 1
ORDER BY 2 DESC;

Bare hex strings of a fixed length are a warning sign, not proof; check the code that writes them. If you find legacy hashes, upgrade them on next login rather than waiting for a reset campaign:

# Rehash on successful login with argon2-cffi; verify_legacy is your old check
from argon2 import PasswordHasher
from argon2.exceptions import VerifyMismatchError

ph = PasswordHasher()  # library defaults follow current guidance; tune for your hardware

def login(user, password):
    if user.hash.startswith("$argon2id$"):
        try:
            ph.verify(user.hash, password)
        except VerifyMismatchError:
            return False
        if ph.check_needs_rehash(user.hash):
            user.hash = ph.hash(password)
            user.save()
        return True
    if verify_legacy(user.hash, password):
        user.hash = ph.hash(password)
        user.save()
        return True
    return False

For accounts that never log in again, wrap the old hash inside the new function (hash the legacy hash with Argon2id) so no weak hash remains at rest, then unwrap on the next successful login. The OWASP cheat sheet describes this upgrade path.

Audit what you keep after cancellation

-- How many cancelled members still have full profiles in the live table?
SELECT
  date_trunc('year', cancelled_at) AS cancelled_year,
  count(*) AS rows,
  count(password_hash) AS with_password_hash,
  count(birth_date) AS with_birth_date,
  count(phone) AS with_phone
FROM members
WHERE status = 'cancelled'
GROUP BY 1
ORDER BY 1;

If the answer is "all of them, with every field", decide what each field is still for. Typical outcomes: delete the password hash at cancellation, since a cancelled member cannot log in; move anything you must keep for legal reasons into a separate store with separate credentials; and set a scheduled deletion that runs without anyone remembering to run it.

What changed since first reports

ItemFirst notice, 9 OctLater position
SizeUp to about 6.43 million member records6,427,735 records; 6,383,279 people (13 Oct)
Cancelled membersNot mentioned212,371 people included (13 Oct)
WindowAccess confirmed 6 OctData obtained 4 to 6 Oct (13 Oct)
Password field"Encrypted password""Password hash value" (13 Oct)
FieldsNine fieldsEleven, after "occupation" and "nickname" were added (16 Oct)
Scope by serviceNot listedFull in scope and out of scope tables (13 Oct)
PoliceNot mentionedConsulted; preparing to cooperate (13 Oct)
Technical detailVulnerability corrected, external access blockedConfiguration, vulnerability and method withheld (13 Oct)
NotificationTo followEmails 15 to 22 Oct; free dial from 22 Oct; lookup from 23 Oct
Financial impactNot mentionedUnder review; not in the FY ending May 2027 forecast (13 Oct)

The figures did not change after 13 October. The 16 October correction explicitly says the counts and every other disclosed item stay the same.

Open questions

  • What vulnerability was corrected, and in which component: custom code, an open source library, a commercial product or configuration?
  • Which password hashing scheme, salt policy and work factor protected the 6,427,735 hashes?
  • Why were the records of 212,371 cancelled members still in the live system, and will that change?
  • Did the attacker reach anything beyond the member management system? The group wide inspection was still under way at the last report.
  • Will a later disclosure publish the withheld details? Under PPC guidance, a final report for leaks that may involve a wrongful purpose is due within 60 days of discovery.

What would have helped

None of this judges BOOKOFF, which cut off the access, reported to the regulator, filed confirmed counts within a week, publicly corrected its own field list and built a self service lookup. The question for everyone else is how to make the same class of event smaller.

Practices any team can use

  • Delete what a cancelled account no longer needs. Start with the password hash, since a member who has left cannot log in. Contact details and birth dates should follow on a schedule your storage enforces.
  • Separate past customers from current ones. Anything kept after cancellation belongs in a different store, under different credentials, off the live app's path.
  • Hash passwords with a slow, salted, modern function, upgrade old hashes on login, and publish the scheme so users can judge their risk after a breach.
  • Collect fewer fields. Occupation and nickname ended up in this notice. Every optional field is a future line in yours.
  • Treat every API behind a public app as public. JPCERT/CC and NICT describe attackers taking apart public Android apps to find back end endpoints and keys. Authorise every request on the server and rate limit everything.
  • Take internal tools off the internet. BI dashboards and staff portals have been hit in this wave.
  • Shorten the patch clock. Know every framework, library, image and product version in internet facing services, and rebuild fast when a fix ships.
  • Write the customer message early. BOOKOFF's list of what it will never ask for is a good template.

Zero-Day Discovery and Gold

Safeguard's Zero-Day Discovery looks for previously unknown flaws in open source packages before a CVE exists. Gold Open Source (gold.safeguard.sh, free, no login) gives searchable CVE intelligence with CVSS, EPSS, KEV status, affected and fixed versions and a recommended safe version, plus a free read API.

The limits: BOOKOFF has not said what the vulnerability was or where it sat. Safeguard has no advisory for it and no patched build related to it. These capabilities help in the shared layer of frameworks, libraries and base images that member systems are built from, where pulling patched, signed components and rebuilding fast removes one common way in. They do nothing about retention or password storage design, the lessons that matter most here.

Where Safeguard fits

Safeguard would not have prevented this incident, and it would not have changed how long cancelled members' data was kept or how passwords were hashed. What it covers, at GA:

  • Dependency and image scanning of the repositories, container images and SBOM files behind a member system, with JSON results under ./output.
  • Component search across projects, showing every project that contains a given component and version when an advisory lands.
  • Vulnerability matching and reachability analysis, ranking the vulnerable code paths your application actually calls.
  • Policies and gates, so a build carrying a known exploited vulnerability can be blocked or held for approval.
  • Autonomous remediation with tested fix pull requests, off by default.
  • The Safeguard CLI assistant, which edits code and runs commands only with your approval, under /permissions modes Ask, Accept edits, Plan, Auto (the default) and Strict. You could ask it to add rehash on login, or a migration that clears hashes when a member cancels, and approve each change.
safeguard scan --dir .                 # a repository
safeguard scan --image <name>          # a container image
safeguard scan --sbom <file>           # an SBOM file

Where Safeguard does not help: it does not monitor logins or traffic, detect credential stuffing, manage retention schedules or see inside a vendor's hosted service.

Common mistakes and troubleshooting

  • Reading "hash" as "safe". A hash is only as strong as its algorithm, salt and work factor. Until those are known, assume some passwords from any large hash dump will be recovered.
  • Putting a reset link in the breach email. It trains people to click exactly the kind of link a phisher will send next week. BOOKOFF's notice deliberately has none.
  • Searching logs only for the defanged form. 69.10.51[.]162 will never appear in a log. Convert indicators back to normal form before searching.
  • Treating a single JA4 match as a hit. JPCERT/CC says the listed JA4 matches ordinary Python clients. Combine it with source address, user agent, path and timing.
  • Upgrading Metabase and stopping there. If the reset password endpoint was reachable, Metabase says to clear sessions, review API keys and admin accounts, and rotate data source credentials after the upgrade.
  • Soft deleting cancelled members. A status flag does not remove a row from backups, replicas or exports.

FAQ

What happened at BOOKOFF?

A third party accessed the domestic BOOKOFF member management system, run by BOOKOFF Corporation. Access was confirmed on 6 October 2026; data was taken between 4 and 6 October. Disclosure came on 9 October and confirmed counts on 13 October.

How many people are affected?

The second report gives 6,427,735 member records, counted by member number, and 6,383,279 people after treating records with the same email address as one person. Of those people, 6,170,908 were active members and 212,371 had cancelled.

Were passwords stolen?

Password hash values were taken, not plain text passwords. BOOKOFF has not named the hashing algorithm. Affected members should change their BOOKOFF password and any matching passwords elsewhere.

Were credit card or bank details taken?

No, according to BOOKOFF. Payment card and bank account data are not held in the affected system. ID document images from mail in buy back are in a separate system and were not affected, and ID images from in store buy back are not stored at all.

How did the attacker get in?

BOOKOFF has not said. Its first notice says it corrected a vulnerability and blocked external access; its second report withholds the system configuration, vulnerability and attack method to avoid inviting further attacks. No CVE or product has been named.

Is this linked to the other Japanese breaches this autumn?

BOOKOFF has not linked it to any other incident, and JPCERT/CC's wave alert does not name BOOKOFF. It falls in the same weeks as the breaches in our Japan breach wave roundup and the Sagawa Express breach, but that is timing only.

How can I tell a real BOOKOFF email from a fake?

The real notice came from bookoff@2902.net with the subject 不正アクセスによる個人情報漏えいに関するお詫びとお知らせ, between 15 and 22 October. It contains no password change link. BOOKOFF will not ask for passwords, card details or bank details by email, SMS or phone. When in doubt, use the official site and the free dial 0120-300-663.

Why were cancelled members included?

Their records were still in the live member management system when the data was taken. The filings do not say why they were kept. The lesson for other teams is to decide, field by field, what a cancelled account still needs, and delete the rest on a schedule.

Would Safeguard have prevented this?

No. The lessons here are about retention, password storage and API exposure, which Safeguard does not manage. Safeguard helps with one shared layer: finding and fixing known vulnerable components in the services you build, and making changes with an assistant that asks before it acts.

BOOKOFF has not named the vulnerability it corrected, so nobody can say whether a package fix was involved. For the parts of a member system that teams do build from open source, this is the general playbook.

Fix it without waiting for upstream

Whatever the vulnerability, most of the risk sits in two gaps. The first is the time between a fix being published and that fix actually running in your production builds. The second, and worse, is the time before any fix exists at all, while a maintainer works out a patch and a release schedule. Waiting through both gaps is a habit, not a requirement. Safeguard gives teams three ways to close them.

1. Autonomous remediation: pull requests, not tickets

When a fixed version exists, Safeguard's Griffin models open a tested, policy gated pull request that moves the affected dependency to the safe version. You can run it on one repository or in bulk across every project that carries the vulnerable version. Remediation covers eight categories, including dependencies, licenses, security posture and findings. Reachability analysis ranks the vulnerable code paths your application actually calls first, so the first pull requests you merge are the ones that matter most. Autonomous remediation ships switched off, with every category set to Manual, so your team decides how much runs on its own and what still needs a human approval.

2. Gold Open Source: the safe version in seconds, free

gold.safeguard.sh is free and needs no login. Search any CVE or package to see affected and fixed versions, CVSS, EPSS, CISA KEV status and a recommended safe version, or use the "Am I affected?" checker. The same data is available through a free read API, README status badges and RSS threat feeds.

3. Gold Registry: start from components that are already fixed

Gold Registry provides hardened, drop in replacements for upstream packages and container images. Every Gold artifact is held continuously to zero exploitable critical or high CVEs and a completed license check, with signed build provenance (signed with Safeguard's key and verifiable with cosign, SLSA Build Level 3 as the design target) and a public evidence page you can hand to an auditor. An artifact loses its Gold badge if it regresses. Teams can point their own package directory at the registry so hardened equivalents resolve without changing how developers install anything.

When upstream has no fix yet, or will not ship one, Safeguard first works to get the fix accepted upstream. If the issue is severe or upstream will not move, Safeguard builds a fork, fixes the vulnerability there and publishes a hardened Gold build, so you are not stuck on a maintainer's release schedule. You can also request a hardened, compatibility tested build of a specific package. Ask which packages it covers before you plan around it.

Your situationWhat to use
A fixed version existsAutonomous remediation opens the upgrade pull request; Gold Open Source confirms the safe version
You need to know today whether you are affectedGold Open Source lookup and "Am I affected?" checker, free and without login
You want vulnerable versions to stop shippingSafeguard policies and gates in CI
Upstream has no fix yet, or will not ship oneA custom Gold request; fork and patch
You want to start clean on new projectsPull hardened components and images from Gold Registry

One honest limit: when the vulnerable code lives in a vendor appliance, a hosted service or an operating system runtime you do not build yourself, the fix still has to come from that vendor or distribution. The steps above apply to the open source dependencies and container images you build and ship, which is where most teams carry the largest and least tracked share of their exposure.

See how Safeguard would have helped

None of these demos shows BOOKOFF or its systems; each is a real Safeguard session applied here to a team running a member system.

This real CLI session fixes a lodash CVE in a sample repository: the assistant reads the finding and advisory, asks before any command that changes something, edits package.json to lodash 4.17.21, runs npm install and npm test with your approval, and pushes nothing. For a member service, you would run /scan . in the authentication service's repository, then ask the assistant to add rehash on login and a test that fails if a cancelled member keeps a password hash, approving each edit and command as it runs.

Click through it at your own pace, or open it full screen.

This real desktop app session shows the CLI session in the conversation list, a request for work on your computer, a folder pick, and Approve or Deny on each command and file edit, ending with an upgrade done and tests passing. A team could pick the folder holding a self hosted BI deployment, ask for the image tag to move to the fixed release for its line, and approve or deny every change before it lands.

Click through it at your own pace, or open it full screen.

This real Android session sends work to a computer running the CLI and approves the command on the phone with Allow once, Allow for turn or Deny. If an advisory lands at night for a framework your login API uses, the on call engineer could approve the dependency bump and test run from a phone, and deny anything that touches the member database until a second person has looked.

Click through it at your own pace, or open it full screen.

To try it on your own services, download Safeguard and follow the CLI docs. For the wider month, read October 2026 security incidents and what would have helped.

Quick check

Does 6,427,735 records mean 6,427,735 people were affected?

No. That is the count of member numbers whose data was sent out. BOOKOFF counts 6,383,279 people after treating records with the same email address as one person; 212,371 of them had cancelled.

Should a BOOKOFF member click the password change link in the notice email?

There is no such link. BOOKOFF's notice emails never include one. Change the password by going to the official app or site directly, and change it anywhere else you used it.

Sources

Last reviewed: 25 October 2026. This is a developing story; check the linked advisories for the latest status.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.