Extra Form
PHP PHP 7.2
CMS Rhymix 2.0

간만에 cent os 업데이트를 했는데

 

db 에러가 났는지 이렇게 아이디 암호가 공개되었습니다.

바로 닫아두긴했지만.. 걱정이네요.

 

No such file or directory 에러가 났는데 왜 DB ID 암호값까지 에러로 노출되는지 궁금합니다.

 

 

 

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /home/아이디/www/common/framework/db.php:121 Stack trace: #0 /home/아이디/www/common/framework/db.php(121): PDO->__construct('mysql:host=loca...', '아이디', '암호', Array) #1 /home/아이디/www/common/framework/db.php(82): Rhymix\Framework\DB->__construct('master', Array) #2 /home/아이디/www/modules/referer/referer.controller.php(138): Rhymix\Framework\DB::getInstance() #3 /home/아이디/www/addons/referer/referer.addon.php(24): refererController->procRefererExecute() #4 /home/아이디/www/files/cache/addons/pc.php(853): include('/home/아이디/www...') #5 /home/아이디/www/classes/module/ModuleHandler.class.php(113): include('/home/아이디/www...') #6 /home/아이디/www/classes/context/Context.class.php(1563): ModuleHandler->__construct() #7 /home/아이디/www/common/framework/debug.php(681): Context::displayErrorPage('\xEC\x84\x9C\xEB\xB2\x84 \xEC\x98\xA4\xEB\xA5\x98', 'Rhymix\\Framewor...', 500) #8 /home/아이디/www/common/framework/debug.php(559): Rhym in /home/아이디/www/common/framework/db.php on line 126

 

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /home/아이디/www/common/framework/db.php:121 Stack trace: #0 /home/아이디/www/common/framework/db.php(121): PDO->__construct('mysql:host=loca...', '아이디', '암호', Array) #1 /home/아이디/www/common/framework/db.php(82): Rhymix\Framework\DB->__construct('master', Array) #2 /home/아이디/www/classes/module/ModuleHandler.class.php(979): Rhymix\Framework\DB::getInstance() #3 /home/아이디/www/classes/context/Context.class.php(1564): ModuleHandler->displayContent(Object(messageView)) #4 /home/아이디/www/common/framework/debug.php(681): Context::displayErrorPage('\xEC\x84\x9C\xEB\xB2\x84 \xEC\x98\xA4\xEB\xA5\x98', 'PHP Fatal Error...', 500) #5 /home/아이디/www/common/framework/debug.php(589): Rhymix\Framework\Debug::displayErrorScreen('PHP Fatal Error...') #6 [internal function]: Rhymix\Framework\Debug::shutdownHandler() #7 {main} Next Rhymix\Framework\Exceptions\DBError: SQLSTATE[HY000] [2002] No such file or directory in /home/아이디/www/com in /home/아이디/www/common/framework/db.php on line 126

 

 

 

 

 

추가로 DB

 

11월 06 16:00:27 서버명 influxd-systemd-start.sh[1341]: [httpd] 127.0.0.1 - - [06/Nov/2022:16:00:27 +0900] "POST /write?db=telegraf HTTP/1.1 " 204 0 "-" "Telegraf/1.24.3 Go/1.19.3" b19d9f1e-5da0-11ed-803f-309c23b36c5e 5148
11월 06 16:00:29 서버명 xrdp[1344]: [INFO ] Socket 12: AF_INET6 connection received from ::ffff:아이피주소 port 53683
11월 06 16:00:29 서버명 xrdp[11315]: [INFO ] Using default X.509 certificate: /etc/xrdp/cert.pem
11월 06 16:00:29 서버명 xrdp[11315]: [INFO ] Using default X.509 key file: /etc/xrdp/key.pem
11월 06 16:00:29 서버명 xrdp[11315]: [WARN ] TLSv1.3 enabled by config, but not supported by system OpenSSL
11월 06 16:00:29 서버명 xrdp[11315]: [INFO ] Security protocol: configured [SSL|RDP], requested [SSL|HYBRID|RDP], selected [SSL]
11월 06 16:00:29 서버명 xrdp[11315]: [ERROR] SSL_accept: I/O error
11월 06 16:00:29 서버명 xrdp[11315]: [ERROR] trans_set_tls_mode: ssl_tls_accept failed
11월 06 16:00:29 서버명 xrdp[11315]: [ERROR] xrdp_sec_incoming: trans_set_tls_mode failed
11월 06 16:00:29 서버명 xrdp[11315]: [ERROR] xrdp_rdp_incoming: xrdp_sec_incoming failed
11월 06 16:00:29 서버명 xrdp[11315]: [ERROR] xrdp_process_main_loop: libxrdp_process_incoming failed
11월 06 16:00:29 서버명 xrdp[11315]: [ERROR] xrdp_iso_send: trans_write_copy_s failed
11월 06 16:00:29 서버명 xrdp[11315]: [ERROR] Sending [ITU T.125] DisconnectProviderUltimatum failed

에러 원인 아시는분 계실까요?

 

 

● mariadb.service - MariaDB 10.3.36 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: failed (Result: exit-code) since 일 2022-11-06 16:13:18 KST; 7s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 3141 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/FAILURE)
  Process: 3092 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
  Process: 3088 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
 Main PID: 3141 (code=exited, status=1/FAILURE)
   Status: "MariaDB server is down"

11월 06 16:13:18 사이트명 systemd[1]: Starting MariaDB 10.3.36 database server...
11월 06 16:13:18 사이트명 mysqld[3141]: 2022-11-06 16:13:18 0 [Note] /usr/sbin/mysqld (mysqld 10.3.36-MariaDB) starting as process 3141 ...
11월 06 16:13:18 사이트명 mysqld[3141]: 2022-11-06 16:13:18 0 [Warning] Can't create test file /home/mysql/사이트명.lower-test
11월 06 16:13:18 사이트명 mysqld[3141]: [87B blob data]
11월 06 16:13:18 사이트명 mysqld[3141]: 2022-11-06 16:13:18 0 [ERROR] Aborting
11월 06 16:13:18 사이트명 systemd[1]: mariadb.service: main process exited, code=exited, status=1/FAILURE
11월 06 16:13:18 사이트명 systemd[1]: Failed to start MariaDB 10.3.36 database server.
11월 06 16:13:18 사이트명 systemd[1]: Unit mariadb.service entered failed state.
11월 06 16:13:18 사이트명 systemd[1]: mariadb.service failed.
 

 

역시 업데이트는하는게 아니였는데 ㅠㅠ

 

 

 

 

 

  • profile

    관리자로 로그인되어 있었다면 에러메시지가 자세하게 나오는 것이 정상입니다. 그렇다고 비번까지 보여줄 필요는 없는데 저건 PHP가 쓸데없이 친절한 거고;;; 라이믹스는 관리자 여부에 따라 에러메시지 전체를 보여줄지 말지 결정하는 것뿐이예요. 만약 관리자가 아닌데도 노출된다면 버그입니다.

     

    DB 오류에 xrdp가 왜 등장하는지 모르겠습니다만, OpenSSL 버전이 오래되어서 TLSv1.3을 지원하지 않는다는 것 같네요. 아파치 오류라면 이해하겠는데, DB 오류를 보고 계신 것 맞나요?

     

    아무튼 실수로 암호가 공개되었다면 암호를 바꾸시는 것을 추천합니다.

  • profile profile
    디비가 없는 상태에서 아이디 암호까지 일반인들에게 모두 공개 되었습니다.
    DB 실행 안되는 문제는

    11월 06 16:13:18 사이트명 mysqld[3141]: 2022-11-06 16:13:18 0 [Warning] Can't create test file /home/mysql/사이트명.lower-test 이부분이 문제였네요

    https://tdoodle.tistory.com/entry/MariaDB-Cant-create-test-file-lower-test
    위 글로 해결하였습니다.
  • profile profile

    근데 업데이트후 서버가 재시작 되었는데 그때도 로그인 캐시가 유지되고 있었을까요?
    그럴 수도 있겠다 생각은 드는데

    방금 DB서버 stop 해서 끄고 비로그인 된 브라우저에서 확인해보니.. 암호가그대로 노출됩니다. 라이믹스 버그일까요?

  • profile profile

    버그이거나, php.ini에서 display_errors = On 으로 설정되어 있어서 그냥 다 화면에 뿌려졌거나, 둘 중 하나일 겁니다.

  • profile profile

    ㅁㅁ.png

    기본값이 무엇인지는 모르겠지만 실서버에서 매일 테스트를 하는지라 제가 켜놨었나보네요.

    off 로 수정하였습니다. 이제는 500에러라고만 뜨고 코드는 안보여지네요.

    근데 에러에 db 암호가 딱 공개되는건 조금 코드 개선이 필요하지 않을까요?

     

    예전에는 저런 에러페이지가아니라 

    aas.PNG

    db를 찾을 수 없습니다. xe 자체 경고창이 에러 화면이 나왔던걸로 기억하거든요.

     

    메인 아이디와 암호 행이 보여지니 난감하네요. 

  • profile profile
    PHP에러가 친절하게 함수에 어떤 값을 인자로 넘겼는지 알려주고 있는거니까요..

    해당 함수에 이러이러한 값으로 넣엇는데 실제로 해당 값이 Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory 에러가 떴을뿐인거고. 실제로 파일이 존재하지 않는 상황이였거나 실행 할 수 있는 상황이 아닌데 이렇게 함수를 호출해줬다고 알려줬을뿐입니다.

    이 경우 라이믹스가 관여를 아에 못했을 수 있는거구요.

    그러면 라이믹스랑은 관계없이 PHP에서는 재역활 재대로 해줬을 뿐인거고. 공교롭게도 에러 뜬 위치가 DB연결하는 함수호출하는 과정에서 발생되어서 아이디가 노출되었을 뿐입니다.

    라이믹스야 저희가 개발했으니 거기에서 아이디 비밀번호를 넘겨준다 이런 정보는 가지고 있겠지만 PHP개발자가 이 언어로 워드프레스도, 그누보드도, 라이믹스도,XE도 만드는데 어떤 함수에 아이디 비밀번호를 넘겨주는지 규칙적으로 알 수 있을까요??

    물론 업데이트 하는과정에서 사이트를 완벽하게 닫지 않고 하신 부분에 대한 문제는 있을 수 있겠지만, 적절하게 업데이트 하시면서 생긴 부분은 누구의 탓을 할 수 없고 적절한 대책을 세워야하지 않을까 생각이 듭니다..ㅠ

    사연적으로 안타깝지만.. 라이믹스가 진짜 실행과정에서 문제가 있는 경우라면 저희쪽에서 어떻게든 막을 수 있는 방법은 찾아보겠으나.. 진짜 Fatal 에러가 발생되는 시점에서 라이믹스가 관여하지 못한 상황이라면 저희도 도리는 어쩔수 없습니다.. 진짜 저런 에러가 발생되는건 라이믹스가 관여를 하지 못했을 수 있을 가능성도 높거든요..
  • profile profile

    DB를 읽어오기 이전에 db 없이 웹이 먼저 노출이 되고 그 이후에 에러 페이지가 뜨지 않고
    더 윗단에서 에러가 발생해서 그렇다는 말씀이신거죠?
    이해 갑니다. 에러코드 보이지 않게 수정해두었으니 더욱 조심해서 사용해야겠네요.

    근데 과거 기억이 잘못되지 않았다면 mysql stop 하면 그냥 기본 에러페이지가 떳다는 생각만 자꾸 나긴하네요.

    물론 500에러도 있긴했는데

    과거에는 db 없이도 레이아웃 까지는 files에 저장된것이 불러와지고 게시판에 접근이 안된다거나 로그인이 안되거나 이증상이 였었거든요

  • profile profile

    예전에는 mysqli를 썼고 지금은 PDO를 쓰지요. PDO가 에러메시지에 불필요한 정보를 포함시키는 것 같아요.

    자세히 확인해 보니 PHP 버전에 따라서도 차이가 있네요. PHP 7.2에서는 에러메시지에 아이디 비번이 노출되는데, 7.4에서는 PDO->__construct()라고만 나옵니다. 정말로 PHP 개발팀이 보안상 문제가 있다고 판단해서 이렇게 바꾼 건지, 아니면 제 개발서버의 설정 차이일 뿐인지는 좀더 뜯어봐야겠습니다.

  • profile profile
    아 확실히 php 문제가 맞나보네요
    제가 잘 모르고 여러 무례를 범했습니다.
  • profile profile
    아닙니다. 이렇게 제보해 주신 덕에 자칫 위험할 수 있는 설정에 대해 다른 사람들도 미리 대비할 수 있겠지요.

    라이믹스 코어에서도 리스크를 줄이기 위해 DB 접속 오류 처리를 조금 다른 방식으로 해보겠습니다.
  • profile profile
    과거의 기억과 현재의 에러의 범위가 다른경우일 수 있습니다.

    현재는 라이믹스가 관여를 아에 하지못한 상황이라면 과거에는 그나마 라이믹스가 마지막까지 관여해서 라이믹스의 독자적인 에러 페이지를 뿌려줬을테니까요.

    어차피 display_erros 옵션을 off으로 했다면 이제는 진짜 에러가 심각하게 나타나는경우 백지만 뜨게 될테니 크게 문제 없고 아래 기진님이 말씀해주신대로 라이믹스에서 처리가 가능하도록 제보해주셔서 감사합니다 :)
  • profile ?
    PHP 8.2 부터는 저런 경우를 방지하지위해 민감파라미터 애트리뷰트가 추가되었습니다
    애트리뷰트는 #으로 시작하기에 하위버전에서 문법오류도 나지않습니다.

    https://php.watch/versions/8.2/backtrace-parameter-redaction

    #[\SensitiveParameter]


    function passwordHash (
    #[\SensitiveParameter]
    string $password)
    {
    var_dump(debug_backtrace());
    }
  • ? profile
    취지는 좋은데 문법은 점점 산으로 가네요... ㅠㅠ
  • profile ?
    php8.2 저 문법 말인데요 애트리뷰트( 어노테이션)이 함수 파라미터에 붙는건 처음보네요
    자바에서는 함수선언에만 붙었던거 같은데.. 자바를 깊게 안해봐서 모르겠네요 ㅋㅋ
  • ? profile
    애트리뷰트가 붙는 것은 괜찮아요. 라이믹스에서도 씁니다.
    예: https://github.com/rhymix/rhymix/blob/master/classes/context/Context.class.php#L9

    근데 저 백슬래시는 또 뭐냐구요;;;
    새로운 문법 만들어내는 사람들이 죄다 변태인가봐요. ㅋㅋㅋ
  • profile ?

    SensitiveParameter 애트리뷰트를 따로 구현한거 없으면
    \ 없어도 됩니다!

    네임스페이스상 전역은 \ 붙고 유저꺼는 다른 네임스페이스붙는데요 애트리뷰트가 객체죠.
    PHP 9 때문에 기존함수, 객체들 네임스페이스 관련해서 정리해야된다고 난리더라고요 ㄷ

    (Vector 자료구조 9.0에 도입하는데 기존함수들 네임스페이스 때문에 이것저것 다 정리한다고 그러네요)

     

    다른언어들은 아무것도 없는게 전역인데 PHP 는 네임스페이스가 나중에 추가되다보니 \ 가 생겼네요

    첨부터 객체지향언어가 아니어서 ㅠ


    권장사항은 PHP 내장애트리뷰트, 클래스, 함수는 \ 를 불이는거죠 따로 같은이름으로 만든거없으면 \ 빼고요..
    근데 사람일은 모르죠 외부배포하는 프로그램이니..

     

     

  • profile
    이런 오류는 관리자가 인지하면 좋은데 인지 못한 상태로 발생했다가는 큰 문제가 되겠네요.
    외부에서 mysql 접속이 불가능하게 만들어 두는게 좋을것 같네요.
    가능하면 주기적으로 비번도 변경하는게 좋을것 같구요.
  • profile profile
    그렇겠네요. 우선 로그 안뜨게 하는게 급선무이고
    db에 문제가 발생해서 접근이 안될때 안좋은 상황이 벌어질 수 있겠네요.
    이런 사례들이 여럿 있더라구요
  • profile ?

    서버 세팅후 첫번째로 할일이 PHP 에러를 브라우저로 출력안되게 해야죠.

    다른언어는 전부 콘솔, 로그파일이 기본인데 PHP 도 그렇긴한데요
    개발자들이 자꾸만 브라우저로 보니까문제..

     

    다른 백엔드 언어들은 개발은 거의다 디버깅툴 설치가 기본인데

    xdebug 모르는 분도 수두룩 ㅠㅠㅠ

  • ? profile

    xdebug를 무작정 권하기도 애매한 게,
    PHP는 로컬서버 실서버 구분없이 작업하는 분이 대부분이라...
    실서버에 xdebug를 설치하면 프로파일링 기능을 사용하지 않아도
    단지 설치되어 있는 것만으로 부하가 2~3배 높아집니다.

     

    PHP 운영 환경의 절대 다수를 차지하는 웹호스팅에서는 아예 불가능하고...
    그런데 뭐, 웹호스팅 유저는 기본적인 에러로그 보는 방법을 모르는 초보자가 대다수이니
    xdebug로 더 자세한 내용을 보여 준다고 도움이 될 것 같지는 않네요.

     

    심지어 로그를 볼 줄 알더라도 웹호스팅 업체들이 에러로그를 기본 제공하지 않아서

    운영자는 결국 display_errors에 의존하는 악순환이 이어지는걸요.

    가장 널리 사용되는 서버 환경의 중요성... ㅠㅠ

  • profile
    stacktrace가 파라미터도 보여주네요. 신기하네요.
  • profile ?

    다른언어도 파라미터 값들 다 보여주지않나요?? 자바, JS에서 그랬던거 같네요 다른언어들은 기본에러출력이 콘솔이라 상관없지만요

  • ? profile
    에러나 디버깅 기록을 log4j로 넘기는 바람에 어마어마한 보안취약점이 생긴 적도 있죠... ㅎㅎ