Nate Schierholtz opened the 11th with a drag bunt off Oliver Perez (2-2). Soriano then connected on a 1-2 pitch over the center-field wall, his ninth.
That ended a 14-game scoreless streak for Perez.
The Mariners had tied the game with two outs in the ninth. Pinch-hitter Henry Blanco earned a one-out walk off Kevin Gregg to start the rally. Michael Saunders ran for him. Nick Franklin moved Saunders to second with a right-side groundout.
Endy Chavez, on a 0-for-19 slide entering his at-bat, sliced a single into shallow center, scoring Saunders with the tying run.
Gregg had been a perfect 13 for 13 in save opportunities this season. His last blown save was Sept. 10, 2011, while with Baltimore at Toronto.
Carlos Villanueva (2-4) earned the win with one inning of relief. Blake Parker finished the 11th for his first career save. He had been the losing pitcher in Friday's 5-4 loss in 10 innings.
Cubs starter Jeff Samardzija allowed six hits and two runs over his seven innings. He struck out five and walked three.
Aaron Harang worked eight innings for the Mariners, allowing three runs on five hits. In three starts against National League teams this season, Harang is 1-2 with a 1.96 ERA. By contrast, he is 2-6 with a 6.52 ERA in starts against American League teams.
Starlin Castro also had a home run for the Cubs and Justin Smoak hit one for the Mariners.
Mariners center fielder Dustin Ackley had to leave the game in the ninth after a diving attempt of a flyball by Soriano. He was diagnosed with sprained left thumb and received precautionary X-rays.
Jason Bay, who had entered as a pinch runner in the eighth, moved to center as the Mariners, hampered with injuries, used up all their bench players and were forced to give up their designated hitter. Left-hander Joe Saunders had to hit in the game's final at-bat. He flied out to center.
Castro put the Cubs up in the first with his solo home run to center. It was his fourth, coming on a 0-1 pitch from Harang.
It was his first home run since April 30 against San Diego. The Cubs have hit at least one home run in a season-high nine straight games.
The Mariners responded with two in the second. Smoak connected on his sixth home run, a 383-foot shot to right on the first pitch from Samardzija.
Mike Zunino then doubled off the left-field wall. He scored on Ackley's single to left. That broke his 0-for-23 slide.
The Cubs bounded ahead again in the sixth with a pair of runs. Schierholtz and Soriano each had RBI singles.
The Mariners were foiled in the eighth. With one out, Kendrys Morales singled and Bay ran for him. Bay broke for second as reliever James Russell tossed over to first and Bay was caught stealing.
Raul Ibanez continued the inning with a two-out double to left. Smoak followed with a single to left that was too hard. Left-fielder Brian Bogusevic scooped up the ball and threw to the catcher Welington Castillo, who tagged out the sliding Ibanez.
NOTES: Finishing games have been a problem for the Cubs. They are 26-9 when leading after seven and 28-6 when leading after eight. Seattle, by contrast, is 30-1 when leading after seven and 30-2 when leading after eight. "It's been tough all year to get those outs, whether it's the eighth or ninth inning, especially after leading so many games after seven innings," Cubs manager Dale Sveum said. "We have to make pitches and get people out in those situations." The Cubs have lost 24 games in which they've had the lead at some point, tied for most in the majors. . Ryan Sweeney left the game in the fourth inning with left rib soreness. . It was a Turn Back the Clock game. The Mariners wore the uniform of the 1909 Seattle Turks, who won a Northwest League championship. The Cubs wore early 1900s replicas.