So I may or may not have bought a new laptop recently, and it may or may not have been a Lenovo.
tl;dr: It was a Lenovo, and there are some things you might want to uninstall from your Lenovo.
I’m kind of in awe of how sneaky these guys are, in terms of the stuff they preinstalled on the system. Some of it appears to be straight-up spyware (otherwise known as “user-experience enhancement” software) of some sort, and I’m trying to figure out what these programs do before I wipe them off the system.
Note: I made sure not to use any of my internet passwords or internet services before I had a chance to take a closer look at the three programs in particular, which I do not trust. I’m also writing this blog post from the new laptop only after uninstalling the programs.
The three programs are:
- CCSDK
- GDCAgentSetupRed
- UESDK
All three programs come preinstalled, and survived the upgrade from Windows 8.1 with Bing to Windows 10. All three programs are written by Lenovo. None of the programs are described openly by Lenovo. So that’s minus points for transparency already.
CCSDK
The CCSDK has a log file folder, CCSDK\log
, which seems to gain a log file every time you restart the computer.
12345678910 Directory of C:\Program Files (x86)\Lenovo\CCSDK\log08/24/2015 10:01 AM <DIR> .08/24/2015 10:01 AM <DIR> ..08/24/2015 12:06 AM 5,724 20150823-181332.466008/24/2015 09:58 AM 4,107 20150824-013917.252808/24/2015 10:01 AM 232 20150824-100129.680808/23/2015 06:11 PM 318 20150824-100755.27124 File(s) 10,381 bytes2 Dir(s) 13,565,394,944 bytes free
Let’s look at the contents of 20150824-013917.2528
. Oh, that’s nice, it’s reporting something to someone, somewhere:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 Log file created at: 2015/08/24 01:39:17Running on machine: LENOVO-PCLog line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msgI0824 01:39:17.641916 556 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x0I0824 01:39:17.641916 556 SettingsServiceApp.cpp:50] WTSQueryUserToken error: 1008I0824 09:28:15.962294 556 ServiceWrapper.cpp:347] user selected:.I0824 09:28:15.962294 556 ServiceWrapper.cpp:357] user has agreed the UE plan.I0824 09:28:15.962294 556 ServiceWrapper.cpp:201] Initilizing data cache:I0824 09:28:15.962294 556 ServiceWrapper.cpp:207] Starting worker service...I0824 09:28:15.962294 556 Service.cpp:464] Worker service start status: 0, active status: 1I0824 09:28:15.962294 556 Service.cpp:515] UE agreement: 1I0824 09:28:16.915457 2920 ServerAddress.cpp:52] ping for 223.202.62.231 round trip: 262I0824 09:28:17.212349 2920 ServerAddress.cpp:52] ping for 223.202.62.231 round trip: 275I0824 09:28:17.212349 2920 ActiveChecking.cpp:79] start to check active from server.I0824 09:28:17.212349 2920 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0824 09:28:36.322564 556 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0824 09:28:36.478818 556 Service.cpp:422] Last disk info send time: 1440371634I0824 09:28:36.478818 556 Service.cpp:383] Last dump code send time:I0824 09:28:37.369484 4296 ServiceEventHandler.cpp:675] starting WinGather...I0824 09:28:37.369484 4296 ServiceEventHandler.cpp:724] Start to checking user logging for starting CCSDKWing. command: "C:\Program Files (x86)\Lenovo\CCSDK\WinGather.exe" 1 1 1 1I0824 09:28:37.385109 4296 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0824 09:28:37.400734 556 Service.cpp:635] Yoga monitor started.I0824 09:28:38.838296 556 Service.cpp:691] system on.I0824 09:28:38.916426 556 Service.cpp:700] usb list event.I0824 09:28:38.916426 556 Service.cpp:713] camera event.I0824 09:28:38.916426 556 Service.cpp:725] speaker event.I0824 09:28:39.088310 556 Service.cpp:735] install software event.I0824 09:28:39.119560 556 Service.cpp:748] cpu memory event.I0824 09:28:39.119560 556 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0824 09:28:39.119560 556 ServerAddress.cpp:147] Test server status: 1I0824 09:28:39.182066 4316 FlexMode.cpp:76] flex mode monitor thread stoped.I0824 09:28:39.541457 556 ServerAddress.cpp:52] ping for 223.202.62.234 round trip: 351I0824 09:28:39.916472 556 ServerAddress.cpp:52] ping for 223.202.62.234 round trip: 356I0824 09:28:40.275861 556 ServerAddress.cpp:52] ping for 223.202.62.234 round trip: 359I0824 09:28:40.400866 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 76I0824 09:28:40.447743 4296 ServiceEventHandler.cpp:738] CCSDKWing started.I0824 09:28:40.478996 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 73I0824 09:28:40.557126 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 78I0824 09:28:40.729006 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 74I0824 09:28:40.854012 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 75I0824 09:28:40.947764 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 76I0824 09:28:41.166530 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 75I0824 09:28:41.244652 556 ServerAddress.cpp:52] ping for 54.215.241.186 round trip: 74I0824 09:28:41.244652 556 Service.cpp:92] device information status:I0824 09:28:57.839133 556 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0824 09:28:58.042268 556 WinhttpProxyClient.cpp:782] crack host: 54.215.241.186, 80, /cic/server/pcI0824 09:28:58.329040 556 Service.cpp:189] set device information send success status: 1I0824 09:28:58.375915 556 Service.cpp:764] device information finished.I0824 09:48:20.072934 2920 ActiveChecking.cpp:79] start to check active from server.I0824 09:48:20.072934 2920 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1[...]
I wonder what WinGather.exe
is, what it gathers, and what it sends.
GDCAgentSetupRed
The GDCAgentSetupRed app has a log file folder, GDCAgentSetupRed\log
, which seems to gain a log file every time you restart the computer.
12345678910 Directory of C:\Program Files (x86)\Lenovo\GDCAgentSetupRed\log08/24/2015 10:01 AM <DIR> .08/24/2015 10:01 AM <DIR> ..06/05/2015 02:03 PM 680 20150605-103724.180808/23/2015 11:58 PM 9,530 20150823-181345.468808/24/2015 09:48 AM 2,226 20150824-013939.100408/24/2015 10:01 AM 213 20150824-100132.70764 File(s) 12,649 bytes2 Dir(s) 13,564,915,712 bytes free
20150823-181345.4688
looks like this, and the other files look similar:
12345678910111213141516171819202122232425262728293031323334 Log file created at: 2015/08/23 18:13:45Running on machine: LENOVO-PCLog line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msgI0823 18:13:45.257730 4756 ServiceWrapper.cpp:276] user has agreed the UE plan.I0823 18:13:45.257730 4864 ActiveChecking.cpp:99] start to check active from server.I0823 18:13:45.257730 4864 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0823 18:13:46.210901 4864 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0823 18:13:49.664186 4864 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0823 18:13:49.664186 4864 SettingsServiceApp.cpp:50] WTSQueryUserToken error: 5I0823 18:13:49.664186 4864 ServiceWrapper.cpp:190] Initilizing ...:I0823 18:13:49.664186 4864 ServiceWrapper.cpp:196] Starting worker service...I0823 18:13:49.664186 4864 Service.cpp:383] Worker service start status: 0, active status: 1I0823 18:13:49.664186 4864 Service.cpp:432] active directory setting: .I0823 18:13:49.664186 4864 Service.cpp:455] UE agreement: 1I0823 18:13:49.664186 4864 Service.cpp:465] http server thread started!I0823 18:13:49.664186 4864 Service.cpp:477] data sender thread started!I0823 18:13:49.664186 4864 Service.cpp:66] device information status:I0823 18:13:49.679815 4892 DataSender.cpp:206] Data sender thread is running..... :I0823 18:13:49.679815 4892 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0823 18:13:49.679815 4892 DataSender.cpp:76] Nation : United StatesI0823 18:13:49.789193 4892 ServerAddress.cpp:54] ping for 54.215.241.186 round trip: 80I0823 18:13:49.867321 4892 ServerAddress.cpp:54] ping for 54.215.241.186 round trip: 73I0823 18:13:49.945449 4892 ServerAddress.cpp:54] ping for 54.215.241.186 round trip: 73I0823 18:13:49.945449 4892 DataSender.cpp:83] serverdomain : mus.lenovo.com.cnI0823 18:13:49.945449 4892 DataSender.cpp:84] serverurl : http://54.215.241.186/cic/reaperI0823 18:13:50.023578 4892 ServerAddress.cpp:54] ping for 54.215.241.186 round trip: 82I0823 18:13:50.101706 4892 ServerAddress.cpp:54] ping for 54.215.241.186 round trip: 73I0823 18:13:56.695768 4864 SettingsServiceApp.cpp:46] WTSGetActiveConsoleSessionId: 0x1I0823 18:13:56.695768 4864 WinhttpProxyClient.cpp:727] crack host: mcn.lenovo.com.cn, 80, /cic/config/device/info.doI0823 18:13:59.086506 4864 Service.cpp:215] set device information send success status: 1I0823 18:13:59.086506 4864 Service.cpp:488] device information finished.I0823 18:33:50.185498 4892 ServerAddress.cpp:54] ping for 54.215.241.186 round trip: 83I0823 18:33:50.277794 4892 ServerAddress.cpp:54] ping for 54.215.241.186 round trip: 88[...]
Question: What is it telling the Lenovo server, and why?
I’m not sure what the answer to this is, as I didn’t get a chance to run Wireshark against the programs, before uninstalling them. Also, I noticed that Ccleaner removed some files related to Lenovo from the Windows Temp folder, but I forgot to check there after uninstalling the Lenovo apps.
Additionally, two files are regularly updated in the GDCAgentSetupRed folder, database.db
and sendlog.txt
:
12345678910111213141516 Directory of C:\Program Files (x86)\Lenovo\GDCAgentSetupRed08/24/2015 10:45 AM <DIR> .08/24/2015 10:45 AM <DIR> ..06/05/2015 02:03 PM 525,752 AutoUpdateModule.exe08/24/2015 10:45 AM 29,696 database.db06/05/2015 02:03 PM 193,976 DatabaseFileProcess.exe06/05/2015 02:03 PM 1,115,064 GDCAgent.exe08/24/2015 10:01 AM <DIR> log06/05/2015 02:03 PM 174,520 RegClean.exe08/23/2015 11:58 PM 756 sendlog.txt06/05/2015 02:03 PM 5,823 unins000.dat06/05/2015 02:03 PM 718,497 unins000.exe11/27/2014 01:01 PM 0 updateSQL.txt9 File(s) 2,764,084 bytes3 Dir(s) 13,459,546,112 bytes free
Let’s take a look at sendlog.txt
. Oh look, it’s filled with timestamps. That’s nice. I’m glad to know our Chinese overlords are aware of when I’m using my laptop:
123456789101112131415161718192021222324252627282930313233343536 2015-08-23 18:34:542015-08-23 18:35:582015-08-23 21:15:102015-08-23 21:16:142015-08-23 21:37:262015-08-23 21:38:302015-08-23 21:39:342015-08-23 22:00:392015-08-23 22:01:432015-08-23 22:02:472015-08-23 22:03:512015-08-23 22:24:552015-08-23 22:25:592015-08-23 22:27:032015-08-23 22:28:072015-08-23 22:49:112015-08-23 22:50:152015-08-23 22:51:192015-08-23 22:52:232015-08-23 22:53:272015-08-23 23:14:312015-08-23 23:15:352015-08-23 23:16:392015-08-23 23:17:432015-08-23 23:18:472015-08-23 23:38:472015-08-23 23:38:472015-08-23 23:38:472015-08-23 23:38:472015-08-23 23:38:472015-08-23 23:58:472015-08-23 23:58:472015-08-23 23:58:472015-08-23 23:58:472015-08-23 23:58:472015-08-23 23:58:47
Let’s take a look at database.db
, maybe it’s in a standard format we can decipher? I tried using SQLite Database Browser, but it doesn’t recognize the file format. If someone has a better idea on how to crack this file, get in touch with me, and I’ll send it to you. Who knows, maybe you’ll get my admin password (which would suck), but then if it’s in there, we all have much bigger problems.
UESDK
UESDK\uehelper.log
12345678910 Directory of C:\Program Files (x86)\Lenovo\UESDK08/24/2015 07:48 AM <DIR> .08/24/2015 07:48 AM <DIR> ..08/24/2015 07:48 AM 154 uehelper.log06/05/2015 02:03 PM 329,688 UESDK.exe06/05/2015 02:03 PM 3,713 unins000.dat06/05/2015 02:03 PM 718,497 unins000.exe4 File(s) 1,052,052 bytes2 Dir(s) 13,564,915,712 bytes free
UESDK doesn’t have a log file folder, but it does have uehelper.log
, which looks like this:
12345678910111213141516171819202122232425262728293031 1032M-80M4002DUS------------------6AF0761C------United States2015-06-05 11:06:44:411United States2015-08-24 07:48:11:361
The 80M4002DUS identifies what model of laptop I bought, which the astute reader could google easily enough. (Admittedly, it’s not a bad little laptop for the money, either.)
The row with dashes actually seems to be some kind of unique identifier, and there were a lot more digits in there, which I’ve blanked out for obvious reasons. I’m not sure how the identifier is formed, I checked the network MAC addresses, but it doesn’t seem to be using those.
The 2015-06-05 11:06:44:411 timestamp was the time of manufacture / initial power-on date for the machine. This matches up nicely with the identifiers on the shipping box that indicated a ship date of 2015-06-08.
The 2015-08-24 07:48:11:361 timestamp matches up with the start of the current Windows login session.
Network Sockets
The GDCAgent.exe program will listen to connections on localhost port 31752. I’m not sure what exactly it does with this open port, though:
Process Explorer
Digging into the process tree on the system reveals that Lenovo’s three programs run with pretty high credentials.
Programs like these can do just about anything they want to a system: restart it, shut it down, rewrite firmware, and so on. Also irritating, neither the Description column nor the Company Name column are filled in.
So what, exactly, do these programs do?
Final Thoughts
For $180 including tax, the laptop was a pretty good deal, it’s only $80 more than getting a Windows license. But it’s buyer beware, with these dubious pieces of software running at all times on the system.
After uninstalling all of the Lenovo preinstalled software, I noticed no difference in the functionality of the laptop. The volume up / volumn down function keys, the brightness up / brightness down keys worked fine. So by that logic, the extra apps that they installed perform no role but to report back to Lenovo every time you turn the computer on or off.
This is not why we buy computers.
Thank you for writing this article and for including the log snippets. I did some digging and found this same exact software running on my new machine. A big AMEN to your closing comment “This is not why we buy computers.”
On a related note, one of the items you listed is a component of SuperFish. If you do some searches on SuperFish + Lenovo you will discover that you have a suspect certificate installed for both IE and Firefox that permits a “man in the middle” attack when visiting websites that ought to be secure.
Thanks for the heads up on SuperFish. More things to dig into when I next use that machine.
Good job documenting this. Pity there isn’t a more obvious way to remove this junkware. Maybe I should have done a clean install!
Thanks for the article. I’ve been wondering about what this software does, too.
Lenovo laptop I looked at had SHAREit installed, a file sharing application enabled at startup.
I deleted it, reboot and it is back.
The startup had an “if not exists” script pointing to SHAREit/shellext/shellext64.bak and it was reinstalling it from a backup, lol.
The GDCAgentSetupRed directory has an interesting text file called “China” which contains thousands of Chinese network and broadcast addresses. Could this be where the logs are going?
Certainly a possibility. Pretty sure I also moved its Windows Firewall rules to deny all outbound. It’s sneaky software indeed.