Ridibooks 1 Click ATO
[Bug Bounty] Starting from a social login link CSRF, a 1 click account takeover through vulnerability chaining
This is a write up of my experience with the Ridibooks bug bounty back in 2023.
Ridi approved the public disclosure of this report.
About the Ridibooks bug bounty
Ridibooks runs a bug bounty program that rewards reports of security vulnerabilities in its own services.
It seems to be one of the few Korean web bug bounties where public disclosure is allowed.
By the standards of Korean web bug bounties, for Low to Medium severity it seems to pay out fairly well(maybe)
(When I sent in my first valid report they also gave me one of Ridi's e book readers, though I'm not sure that still happens these days.)
Interestingly, you can check who got paid how much.
Looking at the hackers.yaml history, this bounty has been picked clean over the years, so fresh bugs are scarce, but I'd recommend watching newly shipped features closely.
Timeline
| Date | Event |
|---|---|
| 2023-08-06 | Reported the vulnerability |
| 2023-08-07 | Report acknowledged |
| 2023-09-06 | Vulnerability confirmed valid |
| 2023-11-20 | Bounty paid |
| 2024-01-02 | Hall of Fame request / acknowledged |
| 2024-01-09 | Added to Hall of Fame |
| 2025-05-28 | Disclosure requested |
| 2025-05-29 | Disclosure approved |
TL;DR
- When a logged user opens a link crafted by an attacker, the attacker's SNS account gets linked to the victim's account, allowing login to the victim's Ridibooks account.
- The attacker can then change the account's email, password, and ID in sequence and remove the linked social logins, reaching a complete Account Takeover (ATO).
- The starting point is a CSRF. Just opening a link the attacker crafted links the attacker's SNS account to the victim's Ridi account.
- On Ridibooks, entering the My Account page requires reconfirming your password. However, with just an arbitrary value (
code), after an error occurs, the My Account page could still be reached. - Without password reconfirmation, SNS account linking and email change requests were possible.
- By chaining the vulnerabilities the email can be changed to the attacker's, and from then on the password can be reset through the legitimate features of "Find ID -> Find Password."
- Finally, removing the existing social-connect and changing the ID completes a Full ATO that is hard to recover.
- Summarized as a diagram, it looks like this.
Vulnerabilities & features
- Breaking the flaws that make up the chain down by role, it comes together like this.
Vulnerabilities
- [V1] Social-connect CSRF: through the social-connect endpoint, the account of the user who clicked the link could be linked to someone else's social account.
- [V2] Password reconfirmation bypass: due to poor error handling on the endpoint, the password reconfirmation could be bypassed to reach the My Account page.
- [V3] Email change: the account email can be changed without password reconfirmation or a second factor.
Features
- Find ID / Find Password (GraphQL): both are normal account recovery features.
- The thing is, because V3 has already changed the email to the attacker's, these legitimate features work as is for the attacker.
Classification
| Category | [V1] Social-connect CSRF | [V2] Password reconfirmation bypass | [V3] Email change |
|---|---|---|---|
| Nature | SNS link state changed regardless of the user's intent (state changing CSRF) | Re auth step bypassed via poor error handling | Sensitive info changed with only a credential, no re auth |
| OWASP Top 10 (2025) | A01 Broken Access Control (CSRF folded into A01 since 2021) / A06 Insecure Design | A10 Mishandling of Exceptional Conditions / A07 Authentication Failures | A01 Broken Access Control / A07 Authentication Failures |
| Korea e finance infrastructure (web) | Cross Site Request Forgery (CSRF) | Insufficient user authentication | Improper user authorization |
[V1] Social-connecting CSRF
- On Ridibooks, there's a feature to manage SNS linking within the My Account page.

- You can link a Kakao, Naver, Google, or Apple account to your Ridi account, and logging in with a linked SNS lets you enter that Ridi account.

- The normal linking flow was designed like this.
reconfirm password -> reach My Account page -> click SNS link ->
log in to the other platform's account -> run the linking endpoint -> complete

- A logged in user is supposed to confirm their password once more before reaching the management page, but the problem is that the endpoint actually handling the link works regardless of that context.
- Since this request is made without any ownership verification, it can occur from just opening a link.
- So the attacker goes through the normal process to create a social-connecting URL but does not actually send the request.
- Log in to the other platform's account -> obtain the social linking URL.
- When a logged in victim opens that link, the request goes out under the victim's session and the attacker's SNS account is linked to the victim's Ridi account.

- Once linking is done, the attacker could log into the victim's Ridibooks account through their own SNS account.

[V2] Password reconfirmation bypass
- As shown below, reaching the My Account page requires a password reconfirmation step.

- If you call it with an arbitrary value (like 123) in the
codeparameter, an error occurs partway through the linking process. - But at that point, instead of being sent to an error page, you can reach the
/account/modify(My Account) thatstatepoints to as is.
- As a result, you can enter a sensitive page without knowing the password.

[V3] Email change without password reconfirmation
- As confirmed in [V2], an email change normally follows the order
My Account -> enter password -> change email. - However, while logged in, you can call
/v1/account/verification/send-emaildirectly and change the email info without entering a password.
- The attacker visits their own mail, clicks the link, and the email can be changed.

[Features] Find ID -> Find Password
- Since the email is already the attacker's, the takeover is carried out through the Find ID & Find Password features that Ridibooks provides.
- The screenshot is edited, but the actual ID value was delivered to the attacker's mail just fine.

- Requesting a password reset with the ID and the attacker's email sends the reset link to the attacker's mailbox.
- The attacker opens the link and can set a new password.

Full chained vulnerability
- In the end, the 1 click Account Takeover I reported to Ridibooks is as follows.
- The attacker creates a social-connect link with their own SNS account and lures a logged in Ridibooks user into clicking it.
- When the victim clicks the link, at that moment the attacker's SNS is linked to the victim's account. (= [V1])
- If a vulnerability like XSS exists in the service, it looks like account takeover would be possible with just the [V3] email change request, without the [V1] social-connecting CSRF.
- The attacker then immediately changes the email to the attacker's address. (= [V3])
- A path of entering My Account directly via the [V2] password reconfirmation bypass and changing the email is also possible.
- Using their own email, the attacker gets ID via Find ID and resets the password via Find Password.
- To keep the victim from recovering the account, the attacker removes the existing social-connect, and if the right to change the ID remains, changes the ID as well.
- This isn't a simple session hijack; with the ID, email, password, and linking all changed, ownership of the account itself moves over, so it can be seen as a complete ATO.
PoC video
Closing
For those who expected deep technical web analysis, this may have felt a bit plain.
But because it's an attack that ties together a few ordinary flaws, I think it's more practical.
From what I've seen, ATOs tend to come from chaining authentication and authorization gaps, big and small, more so than from any single bug.
Flaws that each rate Low to Medium can escalate into account takeover and similar issues the moment they connect.
My thanks to the Ridi security team for taking the report, fixing it, and readily approving the disclosure.
This is a write up of my experience with the Ridibooks bug bounty back in 2023.
Ridi approved the public disclosure of this report.
About the Ridibooks bug bounty
Ridibooks runs a bug bounty program that rewards reports of security vulnerabilities in its own services.
It seems to be one of the few Korean web bug bounties where public disclosure is allowed.
By the standards of Korean web bug bounties, for Low to Medium severity it seems to pay out fairly well(maybe)
(When I sent in my first valid report they also gave me one of Ridi's e book readers, though I'm not sure that still happens these days.)
Interestingly, you can check who got paid how much.
Looking at the hackers.yaml history, this bounty has been picked clean over the years, so fresh bugs are scarce, but I'd recommend watching newly shipped features closely.
Timeline
| Date | Event |
|---|---|
| 2023-08-06 | Reported the vulnerability |
| 2023-08-07 | Report acknowledged |
| 2023-09-06 | Vulnerability confirmed valid |
| 2023-11-20 | Bounty paid |
| 2024-01-02 | Hall of Fame request / acknowledged |
| 2024-01-09 | Added to Hall of Fame |
| 2025-05-28 | Disclosure requested |
| 2025-05-29 | Disclosure approved |
TL;DR
- When a logged user opens a link crafted by an attacker, the attacker's SNS account gets linked to the victim's account, allowing login to the victim's Ridibooks account.
- The attacker can then change the account's email, password, and ID in sequence and remove the linked social logins, reaching a complete Account Takeover (ATO).
- The starting point is a CSRF. Just opening a link the attacker crafted links the attacker's SNS account to the victim's Ridi account.
- On Ridibooks, entering the My Account page requires reconfirming your password. However, with just an arbitrary value (
code), after an error occurs, the My Account page could still be reached. - Without password reconfirmation, SNS account linking and email change requests were possible.
- By chaining the vulnerabilities the email can be changed to the attacker's, and from then on the password can be reset through the legitimate features of "Find ID -> Find Password."
- Finally, removing the existing social-connect and changing the ID completes a Full ATO that is hard to recover.
- Summarized as a diagram, it looks like this.
Vulnerabilities & features
- Breaking the flaws that make up the chain down by role, it comes together like this.
Vulnerabilities
- [V1] Social-connect CSRF: through the social-connect endpoint, the account of the user who clicked the link could be linked to someone else's social account.
- [V2] Password reconfirmation bypass: due to poor error handling on the endpoint, the password reconfirmation could be bypassed to reach the My Account page.
- [V3] Email change: the account email can be changed without password reconfirmation or a second factor.
Features
- Find ID / Find Password (GraphQL): both are normal account recovery features.
- The thing is, because V3 has already changed the email to the attacker's, these legitimate features work as is for the attacker.
Classification
| Category | [V1] Social-connect CSRF | [V2] Password reconfirmation bypass | [V3] Email change |
|---|---|---|---|
| Nature | SNS link state changed regardless of the user's intent (state changing CSRF) | Re auth step bypassed via poor error handling | Sensitive info changed with only a credential, no re auth |
| OWASP Top 10 (2025) | A01 Broken Access Control (CSRF folded into A01 since 2021) / A06 Insecure Design | A10 Mishandling of Exceptional Conditions / A07 Authentication Failures | A01 Broken Access Control / A07 Authentication Failures |
| Korea e finance infrastructure (web) | Cross Site Request Forgery (CSRF) | Insufficient user authentication | Improper user authorization |
[V1] Social-connecting CSRF
- On Ridibooks, there's a feature to manage SNS linking within the My Account page.

- You can link a Kakao, Naver, Google, or Apple account to your Ridi account, and logging in with a linked SNS lets you enter that Ridi account.

- The normal linking flow was designed like this.
reconfirm password -> reach My Account page -> click SNS link ->
log in to the other platform's account -> run the linking endpoint -> complete

- A logged in user is supposed to confirm their password once more before reaching the management page, but the problem is that the endpoint actually handling the link works regardless of that context.
- Since this request is made without any ownership verification, it can occur from just opening a link.
- So the attacker goes through the normal process to create a social-connecting URL but does not actually send the request.
- Log in to the other platform's account -> obtain the social linking URL.
- When a logged in victim opens that link, the request goes out under the victim's session and the attacker's SNS account is linked to the victim's Ridi account.

- Once linking is done, the attacker could log into the victim's Ridibooks account through their own SNS account.

[V2] Password reconfirmation bypass
- As shown below, reaching the My Account page requires a password reconfirmation step.

- If you call it with an arbitrary value (like 123) in the
codeparameter, an error occurs partway through the linking process. - But at that point, instead of being sent to an error page, you can reach the
/account/modify(My Account) thatstatepoints to as is.
- As a result, you can enter a sensitive page without knowing the password.

[V3] Email change without password reconfirmation
- As confirmed in [V2], an email change normally follows the order
My Account -> enter password -> change email. - However, while logged in, you can call
/v1/account/verification/send-emaildirectly and change the email info without entering a password.
- The attacker visits their own mail, clicks the link, and the email can be changed.

[Features] Find ID -> Find Password
- Since the email is already the attacker's, the takeover is carried out through the Find ID & Find Password features that Ridibooks provides.
- The screenshot is edited, but the actual ID value was delivered to the attacker's mail just fine.

- Requesting a password reset with the ID and the attacker's email sends the reset link to the attacker's mailbox.
- The attacker opens the link and can set a new password.

Full chained vulnerability
- In the end, the 1 click Account Takeover I reported to Ridibooks is as follows.
- The attacker creates a social-connect link with their own SNS account and lures a logged in Ridibooks user into clicking it.
- When the victim clicks the link, at that moment the attacker's SNS is linked to the victim's account. (= [V1])
- If a vulnerability like XSS exists in the service, it looks like account takeover would be possible with just the [V3] email change request, without the [V1] social-connecting CSRF.
- The attacker then immediately changes the email to the attacker's address. (= [V3])
- A path of entering My Account directly via the [V2] password reconfirmation bypass and changing the email is also possible.
- Using their own email, the attacker gets ID via Find ID and resets the password via Find Password.
- To keep the victim from recovering the account, the attacker removes the existing social-connect, and if the right to change the ID remains, changes the ID as well.
- This isn't a simple session hijack; with the ID, email, password, and linking all changed, ownership of the account itself moves over, so it can be seen as a complete ATO.
PoC video
Closing
For those who expected deep technical web analysis, this may have felt a bit plain.
But because it's an attack that ties together a few ordinary flaws, I think it's more practical.
From what I've seen, ATOs tend to come from chaining authentication and authorization gaps, big and small, more so than from any single bug.
Flaws that each rate Low to Medium can escalate into account takeover and similar issues the moment they connect.
My thanks to the Ridi security team for taking the report, fixing it, and readily approving the disclosure.
About the Ridibooks bug bountyTimelineTL;DRVulnerabilities & features[V1] Social-connecting CSRF[V2] Password reconfirmation bypass[V3] Email change without password reconfirmation[Features] Find ID -> Find PasswordFull chained vulnerabilityPoC videoClosing2023년도에 리디북스 버그바운티 참여 경험을 정리하였습니다.
이 글은 리디 측의 disclose 승인을 받아 공개가 가능합니다.
리디북스 버그바운티 소개
리디북스는 자사 서비스의 보안 취약점을 제보받아 보상하는 버그 바운티 프로그램을 운영합니다.
국내 웹 버그바운티 중 드물게? 취약점 공개가 가능한 것으로 보입니다.
국내 웹 버그바운티 Low ~ Medium 취약점 기준으로는 바운티를 잘챙겨?주는 것 같습니다.
(최초 유효취약점 제보 시, 리디 e-book 리더기 제품도 함께 제공했는데 요즘은 모르겠습니다.)
신기하게 누가 얼마 받았는지 확인가능합니다.
hackers.yaml 기록을 보면 나름 고인 버그바운티라 유효취약점을 찾는것이 쉽지않지만, 신규 업데이트 기능을 유심히 보는 것을 추천드립니다.
타임라인
| 날짜 | 내용 |
|---|---|
| 2023-08-06 | 취약점 제보 |
| 2023-08-07 | 제보 접수 확인 |
| 2023-09-06 | 취약점 유효 확인 |
| 2023-11-20 | 바운티 지급 완료 |
| 2024-01-02 | Hall of Fame 등재 요청 / 요청 확인 |
| 2024-01-09 | Hall of Fame 등재 |
| 2025-05-28 | 공개(disclose) 요청 |
| 2025-05-29 | 공개(disclose) 승인 |
TL;DR
- 리디북스에 로그인한 사용자가 공격자가 제작한 링크에 접근하면, 공격자의 SNS 계정이 피해자의 계정에 연동되서, 피해자의 리디북스 계정에 로그인 가능합니다.
- 공격자는 순차적으로 해당 계정의 이메일·비밀번호·아이디를 변경하고 연계된 소셜로그인 설정을 제거해 완전한 계정 탈취(Account Takeover)에 이를 수 있었습니다.
- 시작점은 CSRF 입니다. 공격자가 만든 링크에 접근하는 것만으로 공격자의 SNS 계정이 피해자 리디 계정에 연동됩니다.
- 리디북스 서비스의 경우 내 정보 관리 페이지 진입은 비밀번호를 다시 확인하는 과정이 필요합니다. 그러나, 임의 값(
code)만 있으면 오류 발생 후, 내 정보 관리 페이지 진입이 가능하였습니다. - 비밀번호 재확인 없이 SNS 계정 연동, 이메일 변경 요청이 가능하였습니다.
- 취약점을 체이닝하여 이메일을 공격자 것으로 바꿀 수 있고, 그 다음부터는 "아이디 찾기 → 비밀번호 찾기"라는 정상 기능으로 비밀번호까지 재설정이 가능합니다.
- 마지막으로 기존 SNS 연동, 아이디 변경까지 수행하면 되돌리기 어려운 Full ATO 가 완성됩니다.
- 개요도로 요약하면 다음과 같습니다.
취약점 & 기능
- 체인을 이루는 결함을 역할별로 나누면 이렇게 정리됩니다.
취약점
- [V1] 소셜 연동 CSRF: 소셜 연동 엔드포인트를 통해 링크를 클릭한 사용자 계정이 타인의 소셜 계정과 연동될 수 있었습니다.
- [V2] 비밀번호 재확인 우회: 엔드포인트의 에러 처리 미흡으로 비밀번호 재확인 우회하여 내 정보 관리 페이지에 접근 가능했습니다.
- [V3] 이메일 변경: 비밀번호 재확인 또는 2차 인증 없이 계정 이메일 변경이 가능합니다.
악용된 정상 기능
- 아이디 찾기 / 비밀번호 찾기 (GraphQL): 둘 다 정상적인 계정 복구 기능입니다.
- 다만 V3로 이메일이 이미 공격자 것으로 바뀐 상태이기 때문에, 이 정상 기능들이 공격자에게 그대로 동작합니다.
분류
| 구분 | [V1] 소셜 연동 CSRF | [V2] 비밀번호 재확인 우회 | [V3] 이메일 변경 |
|---|---|---|---|
| 성격 | 사용자 의사와 무관한 SNS 연동 상태 변경 (상태변경 CSRF) | 에러 처리 미흡으로 재인증 단계 우회 | 재인증 없이 인증값만으로 민감정보 변경 |
| OWASP Top 10 (2025) | A01 Broken Access Control (CSRF는 2021부터 A01에 통합) / A06 Insecure Design | A10 Mishandling of Exceptional Conditions / A07 Authentication Failures | A01 Broken Access Control / A07 Authentication Failures |
| 전자금융기반시설 (웹) | 크로스사이트 리퀘스트 변조(CSRF) | 불충분한 이용자 인증 | 부적절한 이용자 인가 여부 |
[V1] 소셜 연동 CSRF
- 리디북스의 경우 내 정보 관리 페이지 내, SNS 연동 관리를 할 수 있는 기능이 존재합니다.

- 카카오·네이버·구글·애플 계정을 리디 계정에 연동할 수 있고, 연동된 SNS로 로그인하면 해당 리디 계정으로 들어갈 수 있습니다.

- 정상적인 연동 흐름은 이렇게 설계되어 있었습니다.
비밀번호 재확인 → 내 정보 관리 페이지 접근 → SNS 연동 클릭
→ 연동하는 타 플랫폼 계정에 로그인 → 연동 처리 엔드포인트 실행 → 연동 완료

- 로그인한 사용자는 관리 페이지 접근 전, 비밀번호를 한 번 더 확인하게 되어 있으나 문제는 실제 연동을 처리하는 엔드포인트가 그 맥락과 무관하게 동작합니다.
- 이 요청은 명의 검증없이 이루어지므로 링크 접근만으로 발생할 수 있습니다.
- 따라서 공격자는 정상적인 과정을 통해 소셜 연동 url을 만들고 실제 요청은 진행하지 않습니다.
- 타 플랫폼 계정에 로그인 → 소셜 연동 url 확보
- 로그인 상태의 피해자가 그 링크로 접근하면 피해자의 세션으로 요청이 나가면서 공격자의 SNS 계정이 피해자 리디 계정에 연동 됩니다.

- 연동이 끝나면 공격자는 자기 SNS 계정을 통해 피해자의 리디북스 계정에 로그인할 수 있었습니다.

[V2] 비밀번호 재확인 우회
- 다음과 같이 내 정보 관리 페이지로 이동하기 위해서는 비밀번호 재확인 과정이 필요합니다.

code파라미터에 임의의 값(123 등)을 넣어 호출하면, 연동 처리 도중 에러가 발생합니다.- 그런데 이때 에러 페이지로 보내는 대신
state가 가리키는/account/modify(내 정보 관리)로 그대로 접근 가능합니다.
- 결과적으로 비밀번호를 모르는 상태에서 민감 페이지에 진입할 수 있습니다.

[V3] 비밀번호 재확인 없는 이메일 변경
- [V2]에서 확인한 것과 같이 원래 이메일 변경은
내 정보 관리 → 비밀번호 입력 → 이메일 변경순서가 정상적인 과정에 해당합니다. - 그러나 로그인 상태에서
/v1/account/verification/send-email을 직접 호출하여 비밀번호 입력 없이 이메일 정보 변경이 가능합니다.
- 공격자 메일로 접근 및 링크 클릭하여 이메일 수정가능합니다.

[정상기능] 아이디 찾기 → 비밀번호 찾기
- 이미 이메일이 공격자 것이므로, 리디북스가 제공하는 아이디 찾기 & 비밀번호 찾기 기능을 통해 계정 탈취를 수행합니다.
- 사진은 편집 했으나 실제 아이디 값이 공격자 메일로 정상적을 전달됨

- 확보한 ID + 공격자 이메일로 비밀번호 재설정을 요청하면, 재설정 링크가 공격자 메일함으로 도착합니다.
- 공격자는 링크로 접근하여, 새로운 비밀번호를 설정할 수 있습니다.

전체 체이닝 취약점
- 최종적으로 리디북스에게 제보한 1-click Account Takeover 취약점은 아래와 같습니다.
- 공격자가 자신의 SNS 계정으로 소셜 연동 링크를 만들고, 로그인 상태의 리디북스 사용자에게 클릭을 유도합니다.
- 피해자가 링크를 클릭하면, 이 시점에 공격자의 SNS가 피해자 계정에 연동됩니다. (= [V1])
- 서비스 내, XSS와 같은 취약점 발생 시, [V1]소셜연동 CSRF 없이 바로 [V3]이메일 변경요청만으로도 계정 탈취가 가능할 것으로 보임
- 공격자는 곧바로 이메일을 공격자 주소로 변경합니다. (= [V3])
- [V2]비밀번호 재확인 우회로 내 정보 관리에 직접 진입해 이메일을 바꾸는 경로도 가능
- 공격자는 본인의 이메일 기반으로 아이디 찾기로 평문 ID를 확보하고, 비밀번호 찾기로 비밀번호를 재설정합니다.
- 피해자가 계정을 복구하지 못하도록 기존 SNS 연동을 해제하고, 아이디 변경권이 남아 있으면 아이디까지 변경합니다.
- 단순한 세션 탈취가 아닌 아이디·이메일·비밀번호·연동까지 변경되서 계정 소유권 자체가 넘어가는 완전한 ATO라고 볼 수 있습니다.
PoC 영상
마치며
Web 관련 깊은 기술적 분석을 기대한 분께는 다소 밋밋했을 수 있습니다.
그러나 평범한 결함 몇 개를 엮은 공격이라서 더 실무적이라고 생각합니다.
개인적인 경험상 ATO는 단일 취약점 하나로 터지기보다, 크고 작은 인증·인가 결함을 엮어 만들어지는 경우가 많았습니다.
개별로는 Low~Medium이던 결함들이 연결되는 순간 계정이 탈취 등과 같은 취약점으로 이어질 수 있습니다.
제보를 받아 수정하고 공개까지 흔쾌히 승인해 준 리디 보안팀에 감사를 전합니다.
리디북스 버그바운티 소개타임라인TL;DR취약점 & 기능[V1] 소셜 연동 CSRF[V2] 비밀번호 재확인 우회[V3] 비밀번호 재확인 없는 이메일 변경[정상기능] 아이디 찾기 → 비밀번호 찾기전체 체이닝 취약점PoC 영상마치며